現(xiàn)代科技的發(fā)展如此之快,移動支付、網(wǎng)絡購物、視頻直播等各種應用層出不窮,但是這些應用的背后,卻有著一個共同的基石做支撐,那就是互聯(lián)網(wǎng)。而之所以人人都可以接入互聯(lián)網(wǎng),標準的網(wǎng)絡協(xié)議是必不可少的。在互聯(lián)網(wǎng)發(fā)展之初,國際化標準組織ISO定制了一套國際標準OSI(開放式通信系統(tǒng)互聯(lián)參考模型),在該標準中,網(wǎng)絡協(xié)議被分為了七層,分別是物理層、數(shù)據(jù)鏈路層、網(wǎng)絡層、傳輸層、會話層、表示層、應用層。然而現(xiàn)已成為業(yè)界標準協(xié)議的TCP/IP協(xié)議,并未完全按照OSI模型的七層結(jié)構(gòu)來實現(xiàn),而是分成了網(wǎng)絡接口層、網(wǎng)際層、傳輸層、應用層四個層次。而事實也證明,四個層次的劃分就已經(jīng)能夠非常好的適應現(xiàn)代互聯(lián)網(wǎng)協(xié)議的需求了。
TCP/IP協(xié)議并不是一個協(xié)議,而是一系列協(xié)議的總稱,只是用了其中兩個應用最廣泛的協(xié)議名稱來統(tǒng)稱這個協(xié)議簇了。那么接下來就讓我們一起了解一下這個TCP/IP協(xié)議簇。
上圖是一個TCP/IP協(xié)議的基本框架,當有一個HTTP請求發(fā)生時,數(shù)據(jù)從應用層依次傳遞給傳輸層、網(wǎng)際層、網(wǎng)絡接口層,并在每一層打包上自己的首部,最終通過電信號傳送出去。接收端接收到數(shù)據(jù)包后,再以相反的順序解包并依次上傳,最終到達應用層去解析HTTP數(shù)據(jù)。
下面就以瀏覽器訪問云漢社區(qū)網(wǎng)站的一幀數(shù)據(jù)包為例,了解一下TCP/IP協(xié)議。
該數(shù)據(jù)幀總的結(jié)構(gòu)如圖所示:
接下來分別了解一下各個部分的結(jié)構(gòu)。
以太網(wǎng)數(shù)據(jù)包格式為:首部(14字節(jié))+數(shù)據(jù)(46~1500字節(jié))+4字節(jié)CRC
首部固定為14個字節(jié),包含了目標MAC地址、源MAC地址和數(shù)據(jù)報類型,MAC地址是一個48位(6字節(jié))的物理地址,網(wǎng)卡在出廠時固定死的。
IP數(shù)據(jù)報格式:
IP 數(shù)據(jù)報的首部長度和數(shù)據(jù)長度都是可變長的,但總是4 字節(jié)的整數(shù)倍,一般為20字節(jié)。
對于IPv4,4 位版本字段是4。4 位首部長度的數(shù)值是以4 字節(jié)為單位的,最小值為5,也就是說首部長度最小是4x5=20 字節(jié),也就是不帶任何選項的IP 首部,4 位能表示的最大值是15,也就是說首部長度最大是60 字節(jié)。8 位TOS 字段有3 個位用來指定IP 數(shù)據(jù)報的優(yōu)先級(目前已經(jīng)廢棄不用),還有4 個位表示可選的服務類型(最小延遲、最大呑吐量、最大可靠性、最小成本),還有一個位總是0??傞L度是整個數(shù)據(jù)報(包括IP 首部和IP 層payload)的字節(jié)數(shù)。每傳一個IP 數(shù)據(jù)報,16 位的標識加1,可用于分片和重新組裝數(shù)據(jù)報。3 位標志和13 位片偏移用于分片。TTL(Time to live)是這樣用的:源主機為數(shù)據(jù)包設定一個生存時間,比如64,每過一個路由器就把該值減1,如果減到0 就表示路由已經(jīng)太長了仍然找不到目的主機的網(wǎng)絡,就丟棄該包,因此這個生存時間的單位不是秒,而是跳(hop)。協(xié)議字段指示上層協(xié)議是TCP、UDP、ICMP 還是IGMP。然后是校驗和,只校驗IP 首部,數(shù)據(jù)的校驗由更高層協(xié)議負責。IPv4的IP 地址長度為32 位。
IP數(shù)據(jù)報承載的內(nèi)容最常見的是UDP和TCP兩種數(shù)據(jù)段,首先來看一下UDP段。
UDP 協(xié)議不面向連接,也不保證傳輸?shù)目煽啃?。但是因為?shù)據(jù)段結(jié)構(gòu)簡單,應用也非常廣泛。
接下來重點分析一線TCP段,TCP段首部通常也是20字節(jié)。
序號:指出段中的數(shù)據(jù)部分在發(fā)送方數(shù)據(jù)流中的位置。
確認號:指出接收方希望收到對方下次發(fā)送的數(shù)據(jù)的第一個字節(jié)的序號。
TCP段首部的定長部分為20個字節(jié),即5個單位的長度。
URG位:緊急標志,和緊急指針配合使用,當其為1時表示,此報文要盡快傳送。
ACK位:確認標志,和確認號字段配合使用,當ACK位置1時,確認號字段有效。
PSH位:為推送標志,置1時,發(fā)送方將立即發(fā)送緩沖區(qū)中的數(shù)據(jù)。
RST位:復位標志,置1時,表明有嚴重差錯,必須釋放連接。
SYN位: 同步標志,置1時,表示請求建立連接。
FIN位:終止標志,置1時,表明數(shù)據(jù)已經(jīng)發(fā)送完,請求釋放連接。
窗口大小:32bit,用于向?qū)Ψ酵ǜ娈斍氨緳C的接受緩沖區(qū)的大小。
校驗和字段長度:16bit,校驗范圍包括段首部、數(shù)據(jù)以及偽首部。
TCP的傳輸過程:
建立連接的過程:
【1】. 客戶端發(fā)出段1,SYN 位表示連接請求。
【2】 服務器發(fā)出段2,也帶有SYN 位,同時置ACK 位表示確認。
【3】 客戶端發(fā)出段3,對服務器的連接請求進行應答。
在這個過程中,客戶端和服務器分別給對方發(fā)了連接請求,也應答了對方的連接請求,其中服務器的請求和應答在一個段中發(fā)出,因此一共有三個段用于建立連接,稱為'''三方握手(three-way-handshake)'''。在建立連接的同時,雙方協(xié)商了一些信息,例如雙方發(fā)送序號的初始值、最大段尺寸等。
TCP數(shù)據(jù)傳輸過程:
【1】 ?客戶端發(fā)出段4,包含N 個字節(jié)數(shù)據(jù)。
【2】 ?服務器發(fā)出段5,確認數(shù)據(jù)收到,服務器在應答的同時也向客戶端發(fā)送數(shù)據(jù)。
【3】 ?客戶端發(fā)出段6,對服務器發(fā)來的數(shù)據(jù)表示確認收到。
在數(shù)據(jù)傳輸過程中,ACK 和確認序號是非常重要的,應用程序交給TCP 協(xié)議發(fā)送的數(shù)據(jù)會暫存在TCP 層的發(fā)送緩沖區(qū)中,發(fā)出數(shù)據(jù)包給對方之后,只有收到對方應答的ACK 段才知道該數(shù)據(jù)包確實發(fā)到了對方,可以從發(fā)送緩沖區(qū)中釋放掉了,如果因為網(wǎng)絡故障丟失了數(shù)據(jù)包或者丟失了對方發(fā)回的ACK 段,經(jīng)過等待超時后TCP 協(xié)議自動將發(fā)送緩沖區(qū)中的數(shù)據(jù)包重發(fā)。
TCP連接的關(guān)閉
【1】 ?客戶端發(fā)出段7,F(xiàn)IN 位表示關(guān)閉連接的請求。
【2】 ?服務器發(fā)出段8,應答客戶端的關(guān)閉連接請求。
【3】 ?服務器發(fā)出段9,其中也包含F(xiàn)IN 位,向客戶端發(fā)送關(guān)閉連接請求。
【4】 ?客戶端發(fā)出段10,應答服務器的關(guān)閉連接請求。
建立連接的過程是三方握手,而關(guān)閉連接通常需要4 個段(四次握手),服務器的應答和關(guān)閉連接請求通常不合并在一個段中,因為有連接半關(guān)閉的情況,這種情況下客戶端關(guān)閉連接之后就不能再發(fā)送數(shù)據(jù)給服務器了,但是服務器還可以發(fā)送數(shù)據(jù)給客戶端,直到服務器也關(guān)閉連接為止。
評論