TCP握手/揮手的過程分析
時間:2017-11-24 來(lai)源(yuan):未知(zhi)
TCP連接建(jian)立
在TCP/IP協議中,TCP協議提供(gong)可(ke)靠的(de)連(lian)(lian)接服務,采用三(san)次(ci)握手建立一個連(lian)(lian)接。
服務器必須準備好接受外來(lai)(lai)的(de)連(lian)接。這通過(guo)調用socket、 bind和listen函數來(lai)(lai)完成,稱(cheng)為被(bei)動(dong)打開(passive open)。
第一(yi)(yi)次握手:客戶通過調用(yong)connect進行主動(dong)打開(active open)。這引起客戶TCP發(fa)送一(yi)(yi)個SYN(表示同步(bu))分節(SYN=J),它告訴服務器(qi)客戶將在(zai)連(lian)接中發(fa)送到數據的初始序列號。并進入(ru)SYN_SEND狀態(tai),等待服務器(qi)的確認。
第二(er)次(ci)握手(shou):服務(wu)器必須確認客(ke)(ke)戶的(de)SYN,同時(shi)自己也得發送(song)一個SYN分節,它含有服務(wu)器將在同一連接中發送(song)的(de)數據的(de)初始序列號。服務(wu)器以單個字節向客(ke)(ke)戶發送(song)SYN和對客(ke)(ke)戶SYN的(de)ACK(表示確認),此時(shi)服務(wu)器進入SYN_RECV狀態。
第三次握(wo)(wo)手(shou):客(ke)戶收到服務(wu)器(qi)的SYN+ACK。向服務(wu)器(qi)發(fa)送(song)確認(ren)分節(jie),此分節(jie)發(fa)送(song)完(wan)畢,客(ke)戶服務(wu)器(qi)進入ESTABLISHED狀態,完(wan)成三次握(wo)(wo)手(shou)。

圖1:TCP握手建立連(lian)接(jie)
客戶端的(de)(de)(de)初始序(xu)列(lie)號(hao)(hao)為(wei)J,而服務器的(de)(de)(de)初始序(xu)列(lie)號(hao)(hao)為(wei)K。在ACK里(li)的(de)(de)(de)確認(ren)號(hao)(hao)為(wei)發送這個(ge)(ge)ACK的(de)(de)(de)一(yi)端所(suo)(suo)期待(dai)的(de)(de)(de)下(xia)一(yi)個(ge)(ge)序(xu)列(lie)號(hao)(hao)。因為(wei)SYN只占一(yi)個(ge)(ge)字節的(de)(de)(de)序(xu)列(lie)號(hao)(hao)空間,所(suo)(suo)以每(mei)一(yi)個(ge)(ge)SYN的(de)(de)(de)ACK中(zhong)(zhong)的(de)(de)(de)確認(ren)號(hao)(hao)都是相應的(de)(de)(de)初始序(xu)列(lie)號(hao)(hao)加(jia)1.類似地,每(mei)一(yi)個(ge)(ge)FIN(表示結束)的(de)(de)(de)ACK中(zhong)(zhong)的(de)(de)(de)確認(ren)號(hao)(hao)為(wei)FIN的(de)(de)(de)序(xu)列(lie)號(hao)(hao)加(jia)1.
完成三次握手(shou),客戶端與服務器開(kai)始傳送數據,在上述(shu)過程中(zhong)還(huan)有一些重要概念。
未連接(jie)(jie)隊(dui)(dui)列:在(zai)三次握手(shou)協議中,服(fu)務(wu)器(qi)維(wei)護一個未連接(jie)(jie)隊(dui)(dui)列,該隊(dui)(dui)列為每個客(ke)戶(hu)(hu)端(duan)(duan)的SYN包(bao)(syn=j)開(kai)設一個條目(mu),該條目(mu)表明服(fu)務(wu)器(qi)已收到(dao)SYN包(bao),并向(xiang)客(ke)戶(hu)(hu)發出確認(ren),正在(zai)等待客(ke)戶(hu)(hu)端(duan)(duan)確認(ren)包(bao)。這些條目(mu)所(suo)標識的連接(jie)(jie)在(zai)服(fu)務(wu)器(qi)處(chu)于SYN_RECV狀(zhuang)態(tai),當服(fu)務(wu)器(qi)收到(dao)客(ke)戶(hu)(hu)端(duan)(duan)確認(ren)包(bao)時,刪(shan)除該條目(mu),服(fu)務(wu)器(qi)進入ESTABLISHED狀(zhuang)態(tai)。

TCP連接終止
TCP連接(jie)終止需四(si)個分節(jie)。

圖(tu)2:TCP揮手關(guan)閉連接
第一(yi)次握(wo)手:某個應用(yong)進程(cheng)首先調用(yong)close,我們稱這一(yi)端(duan)執行主動關閉。這一(yi)端(duan)的TCP于是發送一(yi)個FIN分節,表(biao)示數(shu)據發送完畢。
第(di)二次握手:接收(shou)(shou)到FIN的(de)另一端(duan)執行(xing)被(bei)動關閉(passive close)。這個FIN由TCP確認。它的(de)接收(shou)(shou)也作為(wei)文件結束符傳遞給(gei)接收(shou)(shou)端(duan)應(ying)(ying)用進程(cheng)(放(fang)在已(yi)排(pai)隊等(deng)候應(ying)(ying)用進程(cheng)接收(shou)(shou)到任何其他數據之后)
第三次握(wo)手:一段(duan)時(shi)間后,接收到(dao)文件結束符的(de)(de)應(ying)用進(jin)程將調用close關閉它(ta)的(de)(de)套接口。這導致它(ta)的(de)(de)TCP也發送一個FIN。
第四(si)次(ci)握手:接(jie)收(shou)到這個FIN的原發送端TCP對它進(jin)行確(que)認。
面向字節的(de)數(shu)據傳送(song)流(如(ru)TCP字節流、Unix管道等)也使用EOF表示在某個方向上不(bu)再有(you)數(shu)據待傳送(song)。在TCP字節流中(zhong),EOF的(de)讀或寫通過收發(fa)一(yi)個特殊的(de)FIN分節來(lai)實(shi)現。


