
使用TCP時,客戶端與服務器端的通信流程
服務器初始化
1)調用socket,創建文件描述符fd
2) 調用bind將fd與服務器的IP與PORT綁定
3)調用listen將套接字設為監聽模式,准備接收客戶端連接請求
4)調用accept等待並接收客戶端的連接請求,建立好TCP連接后,該函數會返回一個新的已連接套接字newfd
建立連接
1)客戶端調用socket創建文件描述符
2)調用connect,向服務器發送連接請求
3)connect會發送一個請求SYN段並阻塞等待服務器應答(第一次握手)
4)服務器收到SYN,會給客戶端發送一個確認應答ACK,同時發送一個請求(SYN)建立連接(第二次握手)
5)客戶端收到服務器發的SYN+ACK段,表明客戶端連接已建立成功,進入已連接狀態。客戶端再向服務器
發送一個ACK段,服務器收到后則服務器連接成功。
數據傳輸
1)連接建立成功后,在同一連接、同一時刻,通信雙方可同時寫數據(全雙工)
2)服務器端從accept()返回后調用read()開始讀數據,若沒有數據則阻塞等待
3)客戶端調用write()向服務器發送數據請求,客戶端收到之后調用read()處理請求,此過程服務器調用read()阻塞等待
4)服務器調用write()將處理好的請求發送給客戶端,再次調用read()等待下一個請求
5)客戶端收到后從read()返回,發送下一條請求,如此循環下去
斷開連接
1)沒有數據處理了,則客戶端調用close()關閉連接,給服務器發送一個斷開連接請求FIN段(第一次握手)
2)服務器收到客戶端的FIN段,給客戶端發送一個確認應答ACK段,表明同一斷開連接。客戶端收到ACK段並
調用read()返回0,表明客戶端連接已經斷開(第二次握手)
3)read()返回0后,服務器知道客戶端已經斷開連接,它也調用close()關閉連接,給客戶端發送一個斷開連接
請求FIN段(第三次握手)
4) 客戶端收到服務器發送的FIN段,就給服務器一個確認應答ACK段,表明同意斷開連接。客戶端進入TIME_WAIT
狀態,服務器收到客戶端的ACK段后也斷開連接。

TCP協議如何保證可靠性
- 校驗和
- 序列號
- 確認應答
- 超時重傳
- 連接管理
- 流量控制
- 擁塞控制
原理主要有:數據超時重傳和數據應答機制。
TCP會對每個傳輸的字節進行編號,即序列號。
數據超時重傳是發送端在某個數據包發送出去,在一段固定時間后如果沒有收到對該數據包的確認應答,則(假定該數據包在傳輸過程中丟失)重新發送該數據包。
數據確認應答是指接收端在成功接收到一個有效數據包后,發送一個確認應答數據包給發送端主機,該確認應答數據包中所包含的應答序列號即指已接收到的數據中最后一個字節的序列號加1,加1 的目的在於指出此時接收端期望接收的下一個數據包中第一個字節的序列號。
