????TCP/IP協(xié)議大部分是在有線環(huán)境下(比如光纜)傳輸?shù)匿探希赃@可以算是一篇離題作文了……
一、黃昏的清兵衛(wèi)
????推薦一部電影,《黃昏的清兵衛(wèi)》蒿涎,講述的是明治維新前夜一個落魄武士的故事穿撮。為了照顧年幼的女兒和生病的妻子缺脉,清兵衛(wèi)從不和同僚應酬,每天都會在黃昏前準時回家悦穿,因此得一綽號“黃昏清兵衛(wèi)”攻礼。清貧拮據(jù)的生活因為父親的悉心照料,逐漸有了家的溫暖與幸福栗柒。
? ? 同時“黃昏”既表示清兵衛(wèi)的綽號礁扮,同時也隱喻變革年代,傳統(tǒng)的武士階層的逐漸沒落與衰退瞬沦。
? ? 電影的很多細節(jié)也可圈可點太伊。例如日本人對儒家文化和《論語》的崇敬,和關系再親密的朋友交談提問時也需鞠躬逛钻,日本人心中的“盡忠”情結僚焦,兩次相對真實的日刀對決場面,鄉(xiāng)下武士第一次看到槍炮時的驚訝等等曙痘。大環(huán)境下改革與傳統(tǒng)的沖突芳悲,偶爾會映射到日常生活中,在平淡如水的日子里边坤,偶爾激起一個小小的漣漪名扛,之后便慢慢擴散消失。
?? ?俗話說茧痒,飲水思源肮韧。在看完這么好的電影之后,我不禁思考,我是怎么下載到這個電影的惹苗?不難發(fā)現(xiàn)殿较,“迅雷”這個軟件起到了重要作用。
迅雷的下載通常有兩種方式淋纲,一種是利用FTP協(xié)議,從擁有此電影的服務器上下載該電影院究;另外一種是利用p2p協(xié)議洽瞬,從迅雷本身的服務器上將已經(jīng)下載好的電影傳輸?shù)轿译娔X上(由于下載路徑以及迅雷本身的巨大帶寬優(yōu)勢,基于p2p協(xié)議的下載方式速度會遠超F(xiàn)TP)业汰。
?? ?由于我是卑微的非迅雷會員伙窃,也沒有從淘寶上買迅雷的賬號,同時從下載平均速度來看样漆,我應該是使用了FTP協(xié)議的吧……
二为障、網(wǎng)絡模型和網(wǎng)絡協(xié)議族
?? ?上回我們說到,在計算機網(wǎng)絡上有很多很多的協(xié)議放祟,那么這回我們就得嘮嘮到底具體有多少種協(xié)議了鳍怨。為了給這些協(xié)議分類,我們需要在說這些協(xié)議前了解一下互聯(lián)網(wǎng)的模型跪妥。如下圖所示:
????比較主流的互聯(lián)網(wǎng)模型有OSI七層模型和TCP/IP四層模型(這我在系列一的文章里面也說過這茬)鞋喇。OSI的全稱是Open System Interconnection,是國際標準化組織ISO提出的一種試圖使各種計算機在世界范圍內(nèi)互聯(lián)的標準框架眉撵。而TCP/IP模型是一種更新的侦香,更加簡潔的模型。
? ? 事實上纽疟,TCP/IP模型正在逐漸取代OSI模型罐韩,成為使用更加廣泛,更加主流的網(wǎng)絡模型(思考題:是不是因為這個模型是美國人創(chuàng)立的仰挣,所以人家在瘋狂推廣呢伴逸?)。
? ?應用層的協(xié)議面向的是用戶可見的計算機軟件膘壶,比如迅雷错蝴,比如chrome瀏覽器,比如QQ等颓芭∏昝蹋可以看到,下載電影所使用的協(xié)議FTP(文件傳輸協(xié)議)是屬于應用層的協(xié)議亡问。HTTP協(xié)議(超文本傳輸協(xié)議)服務于我們?yōu)g覽器瀏覽網(wǎng)頁官紫;SMTP協(xié)議是用來發(fā)郵件的肛宋;DNS協(xié)議是用來解析域名的,比如找到www.baidu.com對應的是哪個IP地址束世,就是它的工作酝陈;SNMP協(xié)議是用來管理網(wǎng)絡節(jié)點的(我也不知道我在說什么);P2P協(xié)議是一種新型的下載協(xié)議毁涉,火于迅雷沉帮。
? ?傳輸層負責在知道數(shù)據(jù)傳播路徑的情況下,保證數(shù)據(jù)的準確傳輸贫堰。常見的協(xié)議有TCP協(xié)議和UDP協(xié)議穆壕。TCP協(xié)議具有重傳特性,由于誤碼率的存在其屏,如果數(shù)據(jù)傳輸錯誤喇勋,它會要求重傳;UDP協(xié)議沒有這種特性偎行,數(shù)據(jù)傳輸錯誤了就直接丟棄川背,這么做可以節(jié)省網(wǎng)絡的帶寬。
? ?網(wǎng)絡層負責找到數(shù)據(jù)傳輸?shù)钠瘘c和終點蛤袒,以及從起點到終點的具體路徑渗常。IP協(xié)議就是在此。IP協(xié)議有v4和v6之分汗盘,分別表示32位的IP協(xié)議和64位的IP協(xié)議,會在后文詳細說明询一。
? ?網(wǎng)絡接口層負責統(tǒng)一不同的通信媒介隐孽,讓它們在上層看來都是一樣的。換句話說健蕊,網(wǎng)絡接口層關心的是點對點的穩(wěn)定通信菱阵。
? ? (基佬紫的顏色真是好看呢)
三、TCP/IP協(xié)議
? ? 這個協(xié)議包含一系列用于處理數(shù)據(jù)通信的協(xié)議缩功,包括用來尋址的網(wǎng)絡層協(xié)議IP協(xié)議和用來傳輸數(shù)據(jù)的傳輸層協(xié)議TCP協(xié)議晴及,所以叫TCP/IP協(xié)議可以說十分應景了。其他的還包括UDP(用戶數(shù)據(jù)包協(xié)議)嫡锌,ICMP(因特網(wǎng)消息控制協(xié)議)虑稼,DHCP(動態(tài)主機配置協(xié)議)等。
3.1 二進制數(shù)據(jù)
? ? 上回我們說到势木,計算機程序內(nèi)的數(shù)據(jù)蛛倦,包括任何文件,代碼啦桌,視頻溯壶,游戲,都是通過二進制存儲的。八位的二進制可以存儲一個ASCII字符且改,16位的unicode二進制數(shù)字可以存儲包括漢字验烧,韓文,日文在內(nèi)的很多國家語言文字又跛。
對于十進制數(shù)而言碍拆,他有幾位數(shù),就表示他能表示十的幾次方個不同的數(shù)字效扫,比如十進制的三位數(shù)倔监,能表示0~999總共10^3=1000個數(shù)。同理菌仁,對于二進制數(shù)浩习,他有幾位數(shù),就表示他能表示二的幾次方個不同的數(shù)字济丘,比如二進制的三位數(shù)谱秽,能表示0~7總共2^3=8個數(shù)。
? ? 出于方便考慮摹迷,我們很有必要明確的知道某位數(shù)的二進制能夠表示多少個數(shù)字疟赊。比如2位就是4個數(shù)字,4位就是16個數(shù)字峡碉,8位是256個近哟。。鲫寄。吉执。
????另外地来,一比特(b)表示二進制數(shù)的一位戳玫,而一字節(jié)(B)表示二進制數(shù)的八位。所以一字節(jié)=8比特(這也是為什么千兆網(wǎng)的理論最高下載速率是125MB/s)未斑。前一兩年有個笑話咕宿,某電小編在描述5G通信高比特率(1Gbps)的時候,根據(jù)此聲稱一秒能下一部電影蜡秽,也不知道是真不知道還是嘩眾取寵府阀。
3.2 IP協(xié)議
? ? 通常一個協(xié)議的報頭,可以揭示這個協(xié)議的大部分內(nèi)容和運作機制载城。IP協(xié)議數(shù)據(jù)包的報頭如下所示:
????4位的版本號指的是IP協(xié)議的版本肌似,目前只有第4版(0100)和第6版(0110)。報頭長度指的是數(shù)據(jù)包除了數(shù)據(jù)外的IP協(xié)議報頭的大小诉瓦。在上圖的例子中川队,報頭的長度是6*32位(24字節(jié))力细,所以該字段的值為6。先前可知固额,4字節(jié)最多可以表示16個數(shù)字眠蚂,除去0,最大的數(shù)字為15斗躏,所以報頭最多可以有15*32=480位逝慧,總共60字節(jié)的長度。多出來的長度通常是在可選項中增加(不過一般的IP報頭沒有任何可選項啄糙,也就是說報頭僅有20比特)笛臣。
? ?服務類型(Type of Service ,TOS)占了8個比特隧饼。前3比特為優(yōu)先字段沈堡,現(xiàn)在已經(jīng)不用,第8字節(jié)保留未用燕雁。第4~7比特分別表示延遲诞丽,吞吐量,可靠性和花費拐格。當它們?nèi)≈禐?時僧免,分別表示最小時延,最大吞吐量捏浊,最高可靠性和最小費用懂衩。不同類型的應用層協(xié)議需要不同的特性,例如FTP協(xié)議要求最大吞吐量金踪,SNMP(網(wǎng)絡節(jié)點管理)需要最高可靠性勃痴。
? ?總長度字段表示整個數(shù)據(jù)包的字節(jié)長度,由于它有16位热康,所以數(shù)據(jù)包的理論最大長度位65535字節(jié)。由于大部分數(shù)據(jù)鏈路層都不支持特別長的IP數(shù)據(jù)包(上回講的802.11協(xié)議中劣领,最大的數(shù)據(jù)長度是1500字節(jié)左右)姐军,所以很需要將IP數(shù)據(jù)分片。這些分片的數(shù)據(jù)擁有相同的標識字段尖淘。16位的標識字段用來唯一的標識主機發(fā)送的每一份數(shù)據(jù)報奕锌。通常每發(fā)一份獨立報文,標識的值就加1村生,當標識字段的值位1111111111111111(16個1惊暴,也就是65535)的時候,下一個標識為0000000000000001(15個0趁桃,1個1)辽话。值得注意的是肄鸽,標識字段不是排序序號,因為在IP協(xié)議是無連接服務油啤,數(shù)據(jù)可以無序發(fā)送典徘,標識只是為了告訴接收方哪幾個數(shù)據(jù)是同一個包。
標志的第一位是保留不用的益咬,第二位表示是否需要分段(0表示可以分段)逮诲,第三位表示是否是最后一個分段(1表示后續(xù)還有分段)。
由于各IP分片到達目的地的順序可能是無序的幽告,所以需要偏移量來指明該分片在原來數(shù)據(jù)報中的位置梅鹦。偏移量的計算方法為已經(jīng)“裝載”好的分片字節(jié)數(shù)/8。假設我們要傳輸3800字節(jié)的數(shù)據(jù)冗锁,并將其分片為1400齐唆,1400,1000三段數(shù)據(jù)蒿讥。那么分片1的偏移為0/8=0蝶念;分片2的偏移為1400/8=175;分片3的偏移為2800/8=350芋绸。13位偏移量的理論最大值為8192媒殉,理論最大分片大小為8192*8=65536字節(jié),正好對應了IP報的總長度字段(16位)摔敛。
? ?生存期用來設置數(shù)據(jù)包最多可以經(jīng)過的路由器數(shù)廷蓉,通常可以設置為32马昙,64桃犬,128等。每經(jīng)過一個路由器行楞,其值減1攒暇,直到0時該數(shù)據(jù)包就會被丟棄。生存期的設置是為了防止某些數(shù)據(jù)包在網(wǎng)絡中由于找不到目的地而反復傳遞子房,浪費帶寬的情況形用。
? ?協(xié)議字段說明了IP數(shù)據(jù)包封裝的上層協(xié)議類型,比如ICMP(1)证杭、IGMP(2) 田度、TCP(6)、UDP(17)等解愤。頭部校驗和字段用于檢驗IP頭部的數(shù)據(jù)正確性镇饺。數(shù)據(jù)的糾錯方法是一門專門的學問,這里不作展開送讲。
?? ?源IP地址奸笤、目標IP地址字段各占32比特惋啃。用來標明發(fā)送IP數(shù)據(jù)報文的源主機地址和接收IP報文的目標主機地址。占32位的可選項字段用于定義一些其他選項揭保,比如記錄路徑肥橙,時間戳等,這些選項很少被使用秸侣。值得注意的是存筏,可選項字段必須是32位,如果位數(shù)不足味榛,需要用0去填充椭坚。
3.2.1 ICMP
? ?ICMP協(xié)議(InternetControl Message Protocol)用作提高IP數(shù)據(jù)包交付成功的機會。作為IP層的協(xié)議搏色,它可以以IP協(xié)議數(shù)據(jù)報中數(shù)據(jù)的形式善茎,發(fā)送出去。
8位的類型表示不同的情況频轿,常用的類型如下:3是終點不可達垂涯;11是時間超過;12是參數(shù)問題航邢;5是改變路由耕赘;8或0是回送請求或回答;13或14是時間戳請求或回答膳殷。
? ?代碼位會進一步區(qū)分某種類型的幾種不同情況操骡。檢驗和用于檢驗ICMP的報文。
? ? 類型碼下方的32位決定了ICMP的報文類型(似乎反過來說也說得通)赚窃。ICMP報文的類型分為兩種:ICMP差錯報告報文和ICMP詢問報文册招。
3.2.2.1 ICMP差錯報告報文(56字節(jié))
? ??當檢測到IP數(shù)據(jù)包有錯誤時,檢測到的網(wǎng)絡節(jié)點會發(fā)送ICMP差錯報告報文給發(fā)送方勒极。
? ? 報告的差錯共有5種:終點不可達是掰,源點抑制,時間超過辱匿,參數(shù)問題和改變路由(重定向)冀惭。這些問題都是IP數(shù)據(jù)包在網(wǎng)絡漫游尋找目的地時會遇到的問題。
? ? 不廢話了掀鹅,上報文。
1媒楼、當檢測出接收到的IP數(shù)據(jù)包有問題時(比如生存期歸0乐尊,該數(shù)據(jù)包超過了最大路由次數(shù)),該網(wǎng)絡節(jié)點就會啟動生成ICMP的程序划址。
2扔嵌、首先拷貝有問題的IP數(shù)據(jù)包的報頭和前8個字節(jié)限府,再在頭部添加ICMP特有的報頭,如上上圖所示痢缎。
3胁勺、由于這個數(shù)據(jù)是要經(jīng)過網(wǎng)絡的,所以必須在這個數(shù)據(jù)的頭上重新添加一個IP首部独旷。
? ? 喏署穗,這就是最終的成品:
3.2.2.1 ICMP詢問報文(40字節(jié))
? ?詢問報文有兩種案疲,回送請求和回答報文(測試主機和目的站是否可以到達及了解有關狀態(tài)),以及時間戳請求和回答報文(請求某臺主機或路由器回答當前的時間和日期)麻养。
? ?詢問報文有一個比較常用的例子褐啡,那就是ping。 管理員身份打開Windows的cmd窗口鳖昌,可以測試本地電腦是否能和特定網(wǎng)站建立連接:
ICMP的詢問報文格式备畦,目前只能用這個圖來表示:????
3.2.2 IGMP/ARP
? ? IGMP是Internet Group Management Protocol(互聯(lián)網(wǎng)管理協(xié)議)的簡稱。其負責組播成員的管理许昨。
? ? ARP是Address Resolution Protocol(地址解析協(xié)議)的簡稱懂盐,是根據(jù)IP地址獲取物理地址的協(xié)議。
? ? 由于上述兩個協(xié)議涉及到了組播技術和地址技術车要,這又是一個大的范疇允粤,這些內(nèi)容會在本系列(下)下一個推送中說明。
3.3 TCP 協(xié)議
?? ?TCP協(xié)議的作用是保證數(shù)據(jù)的有效傳輸
數(shù)據(jù)的傳輸需要計算機特定的程序去驅(qū)動翼岁。比如我在QQ上向小黃鴨發(fā)送hello类垫,就借助了QQ這個軟件發(fā)送到對方的QQ程序中;我在迅雷上下載電影琅坡,就是借助了迅雷這個軟件悉患,將電影發(fā)送到我的資源管理器程序中。在TCP協(xié)議中榆俺,“特定的程序”用源端口號和目標端口號表示售躁。舉個例子,在知道了源的IP地址 1.1.1.1 和目標的IP地址 2.2.2.2(這一步已經(jīng)由IP報頭完成了)前提下茴晋,當確定了源端口號A和目標端口號B時陪捷,數(shù)據(jù)可以認為是從1.1.1.1的A程序發(fā)送到2.2.2.2的B程序之中。
?? ?不難發(fā)現(xiàn)诺擅,這兩個端口號都是16位的市袖,也就是說,TCP協(xié)議認為烁涌,計算機中運行的進程不會超過65536個苍碟,事實上似乎的確如此酒觅,以我的電腦為例,也就100多個進程吧微峰。
????TCP傳送的字節(jié)流中每個字節(jié)都能按順序編號舷丹。32位的順序號字段表示本報文發(fā)送數(shù)據(jù)的第一個字節(jié)的序號。以下圖為例蜓肆,藍色的方框表示要傳輸?shù)臄?shù)據(jù)颜凯,方框內(nèi)白色的字表示數(shù)據(jù)的大小。第一個數(shù)據(jù)的順序號為0症杏,第二個則是300页慷,第三個是500掀亩,以此類推逆航。序號確保了TCP傳輸?shù)挠行曰炒蟆4_認號字段表示下一個期望收到的字節(jié)序號,比如對于第一個數(shù)據(jù)而言逼友,確認號應該是300精肃。
?頭部長度字段表示頭部占32比特的述目,由于它是4比特的帜乞,所以TCP頭部最多可占32*15=480比特的數(shù)據(jù)司抱。
? ? 接下來有6位標志位字段,出于對其考慮黎烈,協(xié)議在頭部長度字段和標志位字段中插入了保留字段习柠,讓三者之和為16比特。各標志位如下:URG(緊急指針有效)照棋,ACK(確認序列號有效资溃,只有ACK=1時,確認序列號才有效)烈炭,PSH(接收方應該盡快將這個報文交給應用層)溶锭,RST(重新連接),SYN(發(fā)起一個鏈接)符隙,F(xiàn)IN(釋放/刪除一個連接)趴捅。
? ?窗口大小字段用于網(wǎng)絡的流量控制。該值的含義是本機期望一次接收的字節(jié)數(shù)霹疫,理論上限是65535字節(jié)拱绑。由于它沒有定義“一次”到底是多長,所以也無法推測網(wǎng)絡的最高速率丽蝎。網(wǎng)絡的網(wǎng)速控制用了一個比較討巧的方法猎拨,當數(shù)據(jù)傳輸失敗一次后,“網(wǎng)絡窗口”就縮小一倍,也就是說數(shù)據(jù)傳輸速率縮小一倍迟几。當一段時間內(nèi)數(shù)據(jù)沒有傳輸失敗時,網(wǎng)絡窗口隨著時間線性增長栏笆。
? ? 校驗和字段負責對整個TCP報文段类腮,包括TCP頭部和TCP數(shù)據(jù)進行校驗(這與IP協(xié)議只校驗報頭正確性有所不同)。
?緊急指針是TCP協(xié)議中發(fā)送端發(fā)送緊急數(shù)據(jù)的一種方式蛉加。只有當URG標志位為1時才會啟動蚜枢。還是以上圖為例,如果第二個數(shù)據(jù)包緊急指針有效针饥,且緊急指針為34厂抽,那么根據(jù)系統(tǒng)優(yōu)先讀取的就是數(shù)據(jù)中第300+34=334個字節(jié)。
? ?選項字段就是那些……平時基本不會用到的字段丁眼。
3.4 UDP 協(xié)議
? ? 相比于TCP筷凤,UDP的報頭就簡單很多了。
? 源端口號苞七,目標端口號和TCP一樣藐守,長度也是一樣的,校驗和是非必須項蹂风,因為就算是出錯了也不會讓發(fā)送端重傳……
? ? 與TCP盡可能保證數(shù)據(jù)真實可靠不同卢厂,UDP協(xié)議追求的是數(shù)據(jù)的高速率傳輸。換句話說惠啄,TCP保質(zhì)慎恒,UDP保量。
?? ?兩者由于各自的特性撵渡,在應用上有很大差別融柬。TCP協(xié)議會使用在文檔的傳輸,敏感信息姥闭,金融信息的傳輸上丹鸿,因為人們可以忍受此類信息傳輸速率較慢,但是無法忍受信息出錯棚品;UDP適合傳輸視頻靠欢,音頻,圖像之類的數(shù)據(jù)铜跑,比如在看網(wǎng)絡電視時门怪,我們不會很在意景色中有一點小小的瑕疵和模糊,打電話時我們也不會因為聲音里面有一點雜音就怒摔電話锅纺。
3.5 套接字
? ? 假如小黃鴨實在是太受歡迎掷空,導致不僅僅是我,世界各地的人民群眾都想和小黃鴨聊天,查看小黃鴨的個人主頁坦弟。但是小黃鴨一個人根本無法處理這么多的信息护锤,于是他想辦法將自己的電腦改裝成服務器,并且安裝了一系列的程序?qū)iT分類處理世界各地人民的請求酿傍,如下圖所示烙懦。
? ? 可以發(fā)現(xiàn),小黃鴨使用HTTP協(xié)議來實現(xiàn)人們對網(wǎng)頁的訪問請求赤炒,用FTP協(xié)議實現(xiàn)人們想下載他電腦里文件的請求氯析。操作HTTP協(xié)議的程序有80號程序和8080號程序,操控FTP協(xié)議的有20號程序和21號程序莺褒。
上述過程中的程序序號掩缓,在真實的TCP/IP協(xié)議中,被稱作套接字遵岩。套接字包含IP地址和該IP地址內(nèi)的端口號(也就是程序的序號)你辣。一個套接字對可以唯一的確定互聯(lián)網(wǎng)網(wǎng)絡中每一個TCP連接的雙方(客戶IP,客戶端口旷余,服務器IP绢记,服務器端口)。
? ? 這也可以從側(cè)面看出正卧,數(shù)據(jù)通信的主體蠢熄,不是計算機與計算機,而是程序與程序炉旷。
3.6 三次握手
? ? 自古以來签孔,人們對3這個數(shù)字就格外的著迷,證據(jù)可以看下圖:
????互聯(lián)網(wǎng)世界也不例外窘行。程序之間建立連接饥追,需要至少三次通信過程,這三層通信過程罐盔,俗稱為“三次握手”但绕。網(wǎng)絡上有一個非常通俗易懂的例子闡述三次握手的原理。
????然而惶看,英俊帥氣的21世紀五好青年研究問題時絕不會停留在主觀籠統(tǒng)的感受上捏顺。如果想要從報文通信機制上了解三次握手的原則,就需要看下圖:
第一步:服務器(小黃鴨)自己建立傳輸控制模塊TCB(transmission control block)纬黎,進入監(jiān)聽模式幅骄,等待客戶端的鏈接請求。
第二步:客戶端(我)想要聯(lián)絡小黃鴨本今,也新建一塊TCB拆座,并發(fā)送一份數(shù)據(jù)包給小黃鴨主巍,同時進入發(fā)送SYN狀態(tài)。設置標志位SYN=1挪凑,同時按照自身情況選擇初始順序號seq=x孕索。值得一提的是,SYN報文不能攜帶數(shù)據(jù)躏碳,但是需要消耗一個順序號(這個似乎比較容易理解檬果,如果攜帶了數(shù)據(jù)就要消耗更多的順序號了)。
第三步:小黃鴨收到我的消息后唐断,如果同意連接,就發(fā)出確認報文杭抠,同時進入接收SYN狀態(tài)脸甘。設置標志位ACK=1,SYN=1偏灿,順序號依情況設置為y丹诀,確認號設置為我的下一個數(shù)據(jù)x+1。同樣的翁垂,這個報文也無法攜帶數(shù)據(jù)铆遭。
第四步:我收到確認報文后,還要向小黃鴨發(fā)起確認沿猜。同樣的枚荣,設置ACK=1(但是不需要設置SYN位了),同時自己的順序號是x+1啼肩,確認號是y+1橄妆。小黃鴨接收后就我們就進入了建立連接狀態(tài)。這個報文可以攜帶數(shù)據(jù)祈坠,但是如果不攜帶數(shù)據(jù)則不消耗序號害碾。
第五步:愉快的通信。
3.7 四次揮手
? ? 《愛情公寓大電影》中赦拘,唐悠悠說電影殺青的時候和王傳君視頻慌随,王傳君點播了一首《來不及說再見》。然而在帶寬即是資源的網(wǎng)絡世界里躺同,是不允許出現(xiàn)來不及說再見的事情的阁猜。再見一定要說,而且走之前必須釋放資源笋籽。
? ? 按照慣例先上簡單通俗的:
然后再從報文的角度討論該過程:
第一步:客戶端(我)想終止聊天了蹦漠。于是停止發(fā)送數(shù)據(jù),并且發(fā)送終止報文车海,進入終止等待1模式笛园。設置標志位FIN=1(終止報文標準)隘击,確定當前順序號為u。同樣的研铆,終止報文也不可以發(fā)送數(shù)據(jù)埋同。
第二步:服務器(小黃鴨)收到終止報文,同時發(fā)送確認報文棵红,進入關閉等待狀態(tài)凶赁。設置ACK=1,確定當時順序號為v逆甜,確認號為u+1虱肄。同時服務器會通知高層應用程序,結束客戶端向服務器的單向連接交煞。但是如果服務器還要發(fā)送數(shù)據(jù)咏窿,客戶端依然會接收。所以這個狀態(tài)會持續(xù)一段時間素征。
第三步:客戶端接收到確認報文后集嵌,進入終止等待2狀態(tài)。
第四步:當小黃鴨發(fā)送完數(shù)據(jù)后御毅,它會再次發(fā)送一個終止報文根欧,進入最后確認狀態(tài)。設置FIN=1端蛆,ACK=1凤粗,同時確定自己的順序號w,以及確認號u+1今豆。
第五步:我收到了小黃鴨的終止報文侈沪,發(fā)送確認報文。設置ACK=1晚凿,順序號為u+1亭罪,確認號為w+1。在等待一段時間后(2*MSL)關閉連接歼秽,進入關閉狀態(tài)应役。MSL是Maximum Segment Lifetime的簡稱,可以根據(jù)不同應用人為設置燥筷。2MSL的存在是為了確保服務器收到了客戶端發(fā)送的確認報文箩祥。
第六步:服務器接收到確認報文,進入關閉狀態(tài)肆氓。
?? ?可以發(fā)現(xiàn)袍祖,相比于三次握手環(huán)節(jié),由于增加了對未傳輸數(shù)據(jù)的處理谢揪,揮手需要四次蕉陋。
四捐凭、總結
? ? 本文以應用層的FTP協(xié)議開頭,粗略講述了計算機網(wǎng)絡模型各個層中包含的協(xié)議凳鬓。同時針對TCP/IP協(xié)議族茁肠,在報文格式,傳送機制(套接字缩举,握手協(xié)議)上進行了詳細的闡述垦梆。可以發(fā)現(xiàn)TCP/IP協(xié)議不是僅僅兩個協(xié)議仅孩,而是許多協(xié)議(比如UDP,ICMP,ARP等)的集合托猩。
? ? 由于范疇過大,考慮篇幅辽慕,筆者水平等問題站刑,筆者無法從設計思想層面做出好的闡釋。盡管如此鼻百,筆者依舊能在細節(jié)處感受到網(wǎng)絡設計者的良苦用心。例如設置標志位摆尝,利用偏移量等温艇,將大的數(shù)據(jù)分片化傳輸,然后在接收端整個堕汞,利用的就是“分治”的思想勺爱。三次握手協(xié)議讓人不禁想到困擾計算機界的“兩將軍問題”(請自行百度,該問題已經(jīng)被證明無解)讯检,等等琐鲁。