近期事情,跟網絡協議干系,這讓我天然會更深開學習網絡協議,而之前很長一段時間,我對網絡協議的了解都停留在比力淺的層面。
好比:TCP是面向毗連的、可靠傳輸,而UDP好壞毗連的、不成靠傳輸,TCP建連必要3次握手,會形成delay,UDP更快。
好比:socket編程,辦事器socket create、bind、listen、accept、read/write、shutdown/close,客戶端socket create、connect、read/write、shutdown/close,再加上epoll/select這幾下子。
再好比:我曉得網絡編程要無視SIGPIPE信號不然會掛,read前往0代表對端主動關閉,非壅閉的read要放在循環里要思索前往值,多路復用以及壅閉、非壅閉的區別。
TCP/UDP的區別上,我是如此了解的:從北京到杭州,TCP相當于修了一條高鐵線路(建連)再通車發貨(傳輸數據),而UDP相當于寄快遞,丟了不管(直接傳輸數據)。
外表的了解對不合錯誤?可以說對,也可以說不合錯誤。關于使用步驟員來說,有了外表的熟悉+熟習socket編程接口,夠了嗎?不夠嗎?
大物理學家費曼提出一個高效的費曼學習法,即從成績動手,試著把成績都講出來,以教代學,一旦你能把成績都講清晰,便學會了。以是我想實驗一下把TCP/IP講清晰,借此讓本人學明白,特地協助一下讀者。
固然《TCP/IP詳解卷1》是一本關于互聯網協議族很嚴謹細致的書,但在我看來,它略微有點難懂,約莫必要讀幾遍,才干心心相印。固然我沒有才能把這個成績說的更好,但由于我履歷過從稀里懵懂到稍有所悟的歷程,這約莫是大師不成比的,我將盡力用普通易懂的言語把TCP/IP干系的知識講清晰。
TCP/IP協議族是一組協議的聚集,也叫互聯網協議族,用來完成互聯網上主機之間的互相通訊。TCP和IP只是此中的2個協議,也是很緊張的2個協議,以是用TCP/IP來定名這個互聯網協議族,實踐上,它還包含其他協議,好比UDP、ICMP、IGMP、ARP/RARP等。
大學《盤算機網絡》教科書上有經典的網絡ISO七層模子,但七層區分太細了,稍顯繁瑣,不容易記取。
互聯網協議族TCP/IP按粗粒度的四層區分,兩種區分的比力圖讓互干系系一清二楚。
分層是盤算機范疇的常用本事,好比互聯網后端的三層架構“接入-邏輯-存儲”就是分層頭腦的典范使用。
分層是為了斷絕,通太過層區分本能機能,拆解成績,層與層之間商定接口,屏蔽完成細節。
TCP/IP自下到上區分為鏈路層、網絡層、傳輸層、使用層。下屬向表層提供才能,表層使用下屬的才能提供更高的籠統。
1. 鏈路層,也稱網絡接口層,包含利用體系的裝備驅動步驟和網卡,它們一同處理與傳輸前言(光纖等)的物理接口細節。
2. 網絡層,也就是IP層,賣力處理IP datagram在網絡中的傳輸,IP層傳輸的是IP datagram,借助路由表,把IP datagram從網絡的一端傳輸到另一端,簡而言之:IP完成包的路由傳輸,IP協媾和路由器事情在網絡層。
3. 傳輸層,提供端到端之間的通訊,包含提供面向毗連和高可靠性的TCP,以及無毗連不成靠的UDP。貌似TCP更好,但實踐不是如此,UDP由于不必要建連開支,以是更快,使用得也很廣,好比新一代互聯網協議HTTP3就從TCP轉向UDP,應依據順應場景選擇傳輸層協議。
4. 使用層,跟使用干系,不同使用處理不同成績,必要不同的使用層協議。
鏈路層處理數據在前言上的傳輸,以及主機與網卡、光纖等打交道的細節。由于與硬件干系,以是必要借助體系的驅動步驟,鏈路層協議就是界說這些細節的,好比怎樣把數據從網卡發送到光纖,接納什么格式編碼等,它處理的數據在前言上表現、活動的成績。
光有鏈路層功效一定是不夠的,網絡上有不計其數的機器,主機A與B通訊,你不克不及將數據發到主機C,以是模仿實際,要為主機分派網絡地點,經過IP地點去標識網絡中的一臺主機,發送一個數據包,必要準確路由到目標地,這就好比你從家到公司,要顛末哪些途徑,必要輿圖,而路由表就相似這張輿圖。IP處理的是數據包在網絡中的傳輸路由的成績。
有了網絡層的傳輸路由才能,還不夠,由于IP報在傳輸歷程中約莫丟包,好比正中履歷過的路由器緩沖區滿了便會丟包,如此不成靠,假如必要可靠傳輸的才能,便必要傳輸層基于IP層,提供更多的才能,TCP處理了可靠性成績。具體而言,假如丟包了,TCP層會賣力超時重傳,它經過吸收確認和重傳機制確保了可靠傳輸。別的,由于IP報都是獨立路由的,以是從主機A到主機B,一份數據被拆分紅x、y兩個IP報先后發送,這2個包約莫選擇不同的傳輸途徑,如此有約莫y包先于x包抵達,但我們渴望在吸收端(主機B)規復這個數據的信息,但我們無法控制IP報的抵達排序,以是,我們必要在吸收端規復數據,我只必要在x、y包里紀錄它屬于數據塊的哪個局部,然后重組這份數據,這正是TCP做的,它會重新組裝IP報,從而確保排序性,遞交給使用層。
偶爾分并不必要確??煽啃詼睾托蛐?,這便是UDP能提供的,它只是簡便的把數據封裝成IP報,然后經過IP層路由發送到目標端。
再往上,便是使用層協議了,好比http,又好比游戲辦事器自界說協議,使用層協議通?;赥CP大概UDP做傳輸。
什么是協議?懶得去翻協議的種種威望界說了,我以為協議就是商定,跟實際生存中協議這個詞涵義差不多。網絡協議就是通訊兩邊協同恪守的商定,更具體一點,就是界說數據在網絡上傳輸的格式、端正和流程。
由于網絡是分層模子,不同層有不同層的作用,以是為各層界說各層的端正,各層對應的各層協議。
前方講了TCP/IP協議族包含很多協議,這些協議分屬不同的分層,承當不同的作用。
使用層和傳輸層使用端到端(end-to-end)協議,網絡層提供的是逐跳(hop-by-hop)協議。
A給B經過網絡傳送一塊數據,可以假想僅僅是傳輸這塊原始數據是不夠的,由于網絡傳輸歷程中,網絡包到了某個路由器,必要轉發,而轉發必需依托數據包的一些附加信息,好比目標機器。
發送端在發送數據的時分,將原始數據依照協議格式加上一些控制信息,包裝成可在網絡上準確傳輸數據包的歷程叫封裝。
TCP/IP協議族是層層封裝的,從使用層到鏈路層,每顛末一層都要添加一些分外信息(首、尾部)。
改準確的說,在IP和鏈路層傳輸的數據單位叫分組(Packet),分組既可以是一個IP datagram也可以是IP datagram的一個分片(fragment)。
UDP的封裝跟TCP略有不同,主要表如今顛末傳輸層(UDP)之后添加的是8字節UDP首部,產生UDP datagram。
封裝歷程中,顛末TCP/UDP層的時分,會把端標語添加到TCP/UDP首部;顛末IP層的時分,會把協議典范(TCP or UDP or ICMP or IGMP)添加到IP首部;顛末鏈路層的時分,會把幀典范(IP or ARP or RARP)添加到以太網首部。這些信息將被用于吸收端的處理。
吸收端收到數據后,要實行跟發送端相反的解封利用,我們可以把發送端的數據封裝比如成沐浴后一層層穿衣服,而吸收端的利用,相似沐浴前一層層脫衣服,把首尾部剝離,獲取轉達的原始數據。
由于網絡上的主機有不同字節序,如今要經過網絡傳輸,便必要商定一致的網絡字節序(大端序),接納小端序的主機在網絡傳輸數據的時分要轉為大端序。
互聯網上每個接口都有一個唯一的網絡地點,也叫IP地點,IP地點有IPv4和IPv6兩個版本,IPv4是32位4字節的整數,每個字節(8bit)的取值范圍是0~255,以是可以把4字節的IPv4用四個點分開的byte值表現,好比140.252.13.88,每個十進制數值對應32位整數中的每個字節,這種表現法叫點分十進制表現法,很顯然,點分十進制法和int32兩種表現法之間很容易互相轉換。
IPv4地點區分為ABCDE五類,32位地點表現的數值空間僅限,難以為互聯網上的一切聯網裝備分派獨立的IP地點,以是便存在動態分派、共享、公網+內網地點轉化(NAT)等成績,實質上是為了處理IP地點不夠用的成績。
IPv6使用128bit,2的128次方就十分大了,號稱可以為地球上每粒沙子分派一個ip地點。
IP數據報(網絡層)用IP地點、而以太網幀(鏈路層)則是用硬件(48位Mac)地點,ARP和RARP用于IP地點和硬件地點之間做映射(轉換)。
TCP/UDP接納16位端標語來識別(區分)使用,好比主機A向主機B發送了一個IP報,主機B的內核收到該IP報之后,應該交給哪個使用步驟去向理呢?端標語就是用來干這個的,內核會維護端標語到使用步驟之間的對應干系。
比力常用的使用層協議有商定的端標語,也就是著名端標語,而1024~5000之間的端標語是分派給TCP/IP暫且用的,而大于5000的另做他用。也就是說,你用TCP辦法去連網絡辦事器,當地為該socket分派的端標語會在1024~5000之間,這取決于利用體系的端口分派戰略。
域名體系(DNS)提供主機名字和IP地點之間的轉換,好比www.baidu.com是一個域名,使用步驟可以經過一個標準庫函數(gethostbyname)來取得給定名字主機的IP地點,標準庫函數(gethostbyaddr)完成逆利用。
ip地點是一串數字,涵義不清、也不便利于影象,主機名涵義更明晰,www.baidu.com你就很容易記取,這也是為什么存在IP地點還必要主機名的緣故。
吸收端吸收到以太網數據幀(Frame)之后,必要像剝洋蔥一樣,從協議棧由底向上升,即依照鏈路層->網絡層->傳輸層->使用層的排序,去掉各層協議添加的首尾部,將數據取出,交給最表層使用步驟,這個歷程叫Demultiplexing,尊從冊本的翻譯叫分用。
回憶前方封裝的形貌,在傳輸層、網絡層、鏈路層,分散將端標語存入TCP/IP首部,將協議典范存入IP首部,將幀典范存入以太網幀首部。以是在吸收端,將一層層拆掉首部,取出對應信息,然后做分派,丟給不同模塊處理,上圖就是整個處理歷程。
本文講了地點、域名、端口、TCP/IP分層模子、封裝、分用等看法。
你最好能記取TCP/IP鏈路層->網絡層->傳輸層->使用層的四層區分。
TCP segment、UDP datagram、IP datagram、IP fragment、以太網frame、以及IP層和鏈路層之間傳輸的數據單位packet,這些看法你最好分清晰,如此扳談的時分會顯得比力專業而不是很土。
數據封裝,多看幾遍你便能記取了。
TCP封裝格式:以太網首部(14)+IP首部(20)+TCP首部(20)+使用數據+以太網尾部(4)
UDP封裝格式:以太網首部(14)+IP首部(20)+UDP首部(8)+使用數據+以太網尾部(4)
使用層協議在使用層完成,而傳輸層、網絡層、鏈路層都是在內核完成,以是想修正大概優化底層協議很難,由于你幾乎動不了內核,由于網絡上的多量裝備OS你沒法一并改正來,這就是所謂的網絡裝備僵化成績,HTTP3用UDP交換TCP,就是想在使用層本人去完成可靠傳輸等。
每個以太網幀有長度限定(48~1500),網絡上每個裝備也有對包的長度限定,IP報大了就要分片,分片約莫產生在發送端,也有約莫產生在正中裝備,但應該盡力制止分片,IP報會帶有信息讓分片后可以重組,MTU的看法可以了解一下。
ICMP和IGMP邏輯上屬于網絡層,由于他們是IP協議的從屬協議,但實踐上,ICMP和IGMP報文都被封裝為IP datagram傳輸,以是又可以把他們視為IP層之上的協議。
相反ARP和RARP用于IP地點和硬件MAC地點互相轉換,邏輯上屬于鏈路層,但實踐上arp和rarp報文跟IP datagram一樣,都被封裝成以太網Frame傳輸。
吸收端收到以太網幀之后,會走分用流程,終極將原始數據交給使用步驟。
TCP/IP協議的使用步驟常常使用socket編程接口。
有很多跟網絡干系的東西,好比ping、ifconfig、netstat、arp、tcpdump、wireshark等。
一年前,我對網絡編程這塊,頭腦里充溢疑問。
眾所周知,TCP建連三次握手和斷連四次握手,但如前所述,任何時分,從主機A都可以隨意發一個IP報到主機B,網絡主機之間是經過IP層完成路由轉發的,兩點之間的每個IP報都是獨立路由的,既然如此,為什么還要建連?還要糜費時間做A->B、B->A、A->B往返?直接把包發已往不就完了嗎?
假定經過AB創建的3個IP報的作用是表現AB之間的網絡連通性?哪又有什么作用?由于網絡是隨時厘革的,如今連通又不代表下一刻連通。建連之后仿佛并不存在AB之間的真正毗連,只是兩頭OS層面維護的一個形態(數據目標)?是假造毗連?
建連畢竟是什么意思?客戶端發送一個IP報到辦事器去倡導毗連?那跟傳輸數據的平凡IP報又有什么區別?
雙工是什么意思?為什么socket關閉一半傳輸之后就不克不及發送數據了?網絡上IP報不是可以隨意傳輸嗎?這個限定是哪個場合添加的?
擁塞控制是什么?Nagle是什么?滑動窗口是什么?TCP為什么要?;??
socekt的編程接口和種種看法跟TCP/IP原理有怎樣的對應干系?學完TCP/IP原理對了解socket編程有什么協助?
沒有窮究TCP/IP原理之前,我但是是有很多成績的,只是做使用步驟開發,仿佛沒搞懂那些成績也還可以將就干,但畢竟是有點糊里懵懂,以為不太爽。
原本我想一篇文章講清晰TCP/IP的主要內容,但是寫著寫著發覺,如此文章會十分長,以是我決定多寫幾篇,每篇都講清晰一個主題。
版權聲明:本文來自互聯網整理發布,如有侵權,聯系刪除
原文鏈接:http://www.freetextsend.comhttp://www.freetextsend.com/wangluozixun/53613.html