TCP協議工作在OSI模型中的運輸層,我們知道,運輸層的作用是分割和重新組裝數據流并提供端到端的傳輸。那么怎么分割又是怎么組裝的呢?答案就是TCP中的序列號和確認序列號來保證數據的可靠傳輸。序列號將數據進行分割并在數據重組的時候保證了正確的順序。確認號是收端確認收到了數據。(在TCP傳送一個數據包時,它會把這個數據包放入重發隊列中,同時啟動計時器,如果收到了關于這個包的確認信息,便將此數據包從隊列中刪除,如果在計時器超時的時候仍然沒有收到確認信息,則需要重新發送該數據包。)
在TCP通訊中主要有連接的建立、數據的傳送和連接的關閉這三個過程。
TCP建立連接需要三次握手,那么為什么非要是三次呢,三次都做了什么。三次呢是保證可靠傳輸的最少次數。假如是主機A向主機B發送連接請求,第一次握手是B知道A能發送數據,第二次握手是A知道B既能發送數據也能接收數據,第三次握手是為了讓B知道A能接收數據。簡而言之,三次握手是為了連接雙方知道對方既能接收數據也能發送數據。
了解TCP協議就要知道TCP中有哪些常見字段呢?
- Sequence Number: 用來標識該端發送的數據字節流,它表示在該報文段中第一個數據字節在數據流中的序號;主要用來解決網絡報亂序的問題;
- Acknowledgment Number: 32位確認序列號包含接收端所期望收到的下一個序號,因此,確認序號應當是上次已成功收到數據字節序號加1。主要用來解決不丟包的問題;
- TCP Flags
1: SYN 表示同步序號,用來創建一個連接
2: ACK 表示對數據包進行確認,只有當標志位中的ACK標志為1時該確認序列號的字段才有效。用來確認一個連接
3: FIN 表示數據傳輸完成,可以斷開連接。用來終結一個連接
三次握手
Client ==> SYN = 1, ACK = 0,seq = J,ack = 0 ==> Server
Client <== SYN = 1, ACK = 1,seq = K,ack = J + 1 <== Server
Clinet ==> ACK = 1, seq = J + 1,ack = K + 1 ==> Server
SYN標志位和FIN標志位需要占1位 所以ack = seq + 1
開始數據傳輸
假如發送端 seq = J ,發送了 n個數據字節,那么接收端的ack = J + n
下一次 該發送端的seq = J + n 等于 接收端的 ack
四次分手
Client ==> FIN = 1,seq = J,ack = X ==> Server
Client <== ack = J + 1 <== Server
Clinet <== FIN = 1, seq = X <== Server
Clinet ==> ack = X + 1 ==> Server
為啥揮手是四次呢,因為ack和FIN不能同時發送,我收到你的關閉連接請求了,但是此時我可能還有數據沒傳完,需要繼續傳送,等我傳完了,就可以發送FIN字段表示我也要關閉連接了