1、TCP三次握手(1)第一次握手:客戶端的端口為57063,服務器端口為80;
客戶端向服務器請求建立連接,發送其TCP數據報,數據方向 57063 -> 80;
數據報中,SYN=1,是一個建立連接的信號;ACK=0,沒有開啟序號確認;
客戶端的Sequence number為一個隨機值x=1926459878,其上面一行為相對序號;Acknowledgment number :0;
(2)第二次握手:服務器收到請求,回復客戶端,數據方向 80 -> 57063;
SYN=1,服務器連接允許;
ACK=1,客戶端收到之后要驗證(x+1)=Acknowledgment number;
服務器表示已經接收到x=1926459878,并說明下次要收到(x+1),即Acknowledgment number=1926459879;
服務器發送自己的Sequence number,也是一個隨機值,y=980795485;
(3)第三次握手:客戶端驗證 自己的Sequence number+1=1926459879,和ACK=1;
若驗證成功,向服務器發送數據報,數據方向 57063 -> 80;
數據報中,SYN=0,表明最后的確認;
ACK=1,服務器收到報之后要驗證,驗證值(y+1)=980795486=Acknowledgment number;
客戶端回復服務器期望值Sequence number=(x+1)=1926459879;
服務器收到報之后,確認 自己的Sequence number+1=980795486,ACK=1;
若驗證成功,則一次TCP連接建立,可以通信了。
2、四次揮手圖中,客戶端的IP地址為:192.168.99.30;服務器的地址為:154.8.190.35。
一次TCP連接斷開以后,再次連接同一個服務器需要重新握手連接,并且重新分配端口號。
下面對圖中第一次斷開進行分析,第一個FIN前,客戶端向服務器發了最后一個包。
包中,Sequence number=1392,Acknowledgment number=607(為了方便均取相對值)。
(1)第一次揮手:客戶端申請斷開連接,向服務器發送數據報;
FIN=0,客戶端表明自己沒有數據要發了,申請斷開連接;
ACK=1,服務器收到包之后要驗證Acknowledgment number;
Sequence number=1392,因為上一個包Seq=1392,Len=0;
Acknowledgment number=607,因為上一個Ack=607,期間又沒有收到服務器的數據;
(2)第二、三次揮手:服務器回復客戶端;
第二次揮手是服務器告訴客戶端我收到了你要斷開的請求,但我可能還有數據沒發完,你等我后面通知,FIN=0;
第三次揮手是服務器也完成了數據傳送,告知客戶端我也完事了,FIN=1;
圖中客戶端申請斷開時、恰好服務器也沒有數據要發,于是第二、三次揮手的包合并了。
服務器收到包,驗證ACK=1,自己要發的下一個包的序號=607;
驗證成功,答復客戶端:
Sequence number=607;
Acknowledgment number=1393,ACK=1;表明客戶端收到之后也要驗證要發的下一個包序為1393;
FIN=0。
(4)第四次揮手:客戶端收到包,驗證ACK=1,自己要發的下一個包序=1393;
驗證成功,答復服務器:
Sequence number=1393;
Acknowledgment number=608,ACK=1;表示服務器收到之后要驗證自己下一個包序=608;
FIN=0;
客戶端發送完等待一段時間后關閉;
服務器收到包驗證ACK=1、下一個包序=608,驗證成功,服務器關閉。