TCP和UDP的區別:
tcp是面向連接的可靠的傳輸協議
udp是非連接的不可靠的傳輸協議
TCP組成
可以看到雖然tcp是面向字節流的,但是其傳輸的基本單位還是報文(tcp首部和數據,ip報文和udp報文也是由首部和數據組成)
TCP的主要特點:
1.面向連接,應用程序在使用tcp之前,必須建立tcp連接,在傳輸完成之后再釋放連接
2.點對點連接(UDP可以一對多,一對一)
3.tcp連接傳輸的數據是可靠的交付服務
4.全雙工,雙方可以再任意時刻發送數據
5.面向字節流,雖然應用程序和TCP交互的是大小不等的數據塊,但是tcp只保證,發送方和接收方接到的字節流相同。
TCP連接:
每條tcp連接有兩個端點,連接的兩個端點稱為套接字(socket)
套接字是由ip和端口號組成的。例如 127.0.0.1:8080
TCP可靠傳輸的工作原理
tcp通過校驗和,重傳控制,序號標識,滑動窗口,確認應答實現可靠傳輸。如丟包時的重發機制,還可以對次序亂掉的分包進行順序控制。
1.停止等待協議
每發完一個分組,就等對方確認,在收到對方確認后再發送下一個分組
2.滑動窗口
3.超時重傳
4.基於滑動窗口的流量控制
5.擁塞控制(tcp擁塞控制的方法 慢開始,擁塞避免,快重傳,快恢復)
TCP的連接管理(三次握手)
服務器是處於監聽狀態的,以便及時發現客戶端建立連接的需求。 客戶端TCP進程主動發出Flag段SYN=1,報文序列號seq=x的報文段(A),請求建立連接。狀態變為SYN-SENT(同步已發送)。 服務器收到對應報文段(A)后,會發出確認報文段(B)。
該報文(B)的Flag段的SYN和ACK都是1,確認號ack=x+1(意為對A的確認),同時設定自己的初始序列號seq=y。狀態由LISTEN(監聽)變為SYN-RCVD(同步收到)。 客戶端收到服務器的確認后,還需向服務器發送確認。報文段(C)的Flag的ACK=1,確認號ack=y+1(意為對B的確認),序列號seq=x+1。狀態變為ESTABLISHED(已建立連接)。
服務器在收到報文段后狀態也變為ESTABLISHED。 客戶端的最后確認是必要的,可以防止以失效的請求建立連接報文突然到達服務器而產生錯誤。
為什么要三次握手呢?
若建立連接只需兩次握手,客戶端並沒有太大的變化,仍然需要獲得服務端的應答后才進入ESTABLISHED狀態,而服務端在收到連接請求后就進入ESTABLISHED狀態。
此時如果網絡擁塞,客戶端發送的連接請求遲遲到不了服務端,客戶端便超時重發請求,如果服務端正確接收並確認應答,雙方便開始通信,通信結束后釋放連接。
此時,如果那個失效的連接請求抵達了服務端,由於只有兩次握手,服務端收到請求就會進入ESTABLISHED狀態,等待發送數據或主動發送數據。
但此時的客戶端早已進入CLOSED狀態,服務端將會一直等待下去,這樣浪費服務端連接資源
參考:
https://juejin.im/post/5a49d95af265da430a50ed8c