要熟練掌握TCP內部工作原理
原理1:與對方套接字的連接(三次握手)
原理2:與對方主機的數據交換
原理3:斷開與套接字的連接(四次揮手)
|
|
|
|
|
|
|
|
||||||||||||||
|
利用TCP或UDP套接字收發數據時,需要利用下面的四層協議棧完成。 TCP/IP 協議棧: 應用層 TCP層 UDP層 IP層 鏈路層
鏈路層時物理鏈接標準化的結果,也就是最基本的領域。 IP層是面向消息的、不可靠的協議。在每次傳輸數據時會幫我們選擇路徑。 TCPUDP層以IP層提供的路徑信息爲基礎完成實際的數據傳輸。TCP協議確認後向不可靠的IP協議賦予可靠性。決定了數據傳輸方式。 網絡編程的大部分內容就是設計並實現應用層協議。 |
|
|
|
|||||||||||||||||
|
|
|
accept會自動創建一個用於與客戶端建立連接,並用於數據IO。
connect函數返回說明的是已經被服務端的listen函數接收到,而不是被accept了。因此connect函數返回後並不立即進行數據交換。 在調用connect函數時,操作系統自動創建套接字並自動分配,其中IP用計算機的IP,端口隨機。
在tcp時,要牢記收發數據是沒有數據邊界的。。。。即服務器即使調用了1次write函數傳輸40字節的數據,客戶端也有可能通過4次read函數調用每次讀取10字節。 TCP中IO緩衝的特性有如下四點 1、IO緩衝在每個TCP套接字中單獨存在。 2、IO緩衝在創建套接字時自動生成。 3、關閉套接字後也會繼續傳遞輸出緩衝中遺留的數據。 4、關閉套接字將丟失輸入緩衝中的數據。 TCP的滑動窗口協議保證了不會因爲緩衝溢出而丟失數據。 write函數返回的時間點時將數據移動到緩衝區時。
本次複習涉及到了三次握手,整理內容詳見:https://blog.csdn.net/qq_40962234/article/details/104183523 本次複習也涉及到了四次揮手,整理內容詳見:https://blog.csdn.net/qq_40962234/article/details/104183936
關於UDP和TCP的差異 簡單來說,TCP比UDP可靠,而UDP比TCP性能高,就是快。 詳細的區別再昨天的複習任務中有。 區分UDP和TCP的最重要的標誌是流控制機制。(TCP的生命就在於流控制) 當然可以這麼說:UDP和TCP的差異只在於流控制機制。!。
UDP最重要的作用就是根據端口號傳到主機的數據包交付給最終的UDP套接字。 傳輸壓縮文件是一般用TCP,傳輸直播數據一般用UDP,很好理解。 UDP實現特點: UDP中的服務器端和客戶端沒有連接。 UDP服務器端和客戶端均只需1個套接字。
在UDP中套接字的地址分配有兩種方式 1、調用bind()函數分配,bind()函數不區分TCP和UDP. 2、在sendto()中會自動分配。 即若先使用了sendto(),就不需要bind()手動分配,若先要使用recvfrom(),就需要bind()先一步分配。
注意,在UDP通信過程中使用IO函數調用次數需要保持一致。 UDP套接字傳輸的數據包又稱爲數據報,實際上數據報也屬於數據包的一種。因爲UDP中存在數據邊界,一個數據包即可稱爲1個遠征數據,所以稱爲數據報!!!! |
||||||||||||||||||
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
實際上,sendto()函數每次傳輸數據時都會經歷以下三個階段: 1、向UDP套接字註冊目標IP和端口號。 2、傳輸數據 3、刪除UDP套接字中註冊的目標地址信息。
因此如果要重複好幾次的向同一個目標傳輸數據時。使用sendto傳輸的話會多進行好幾次的第一個步驟和第三個步驟。 此時需要使用connect函數使得UDO套接字變成已連接套接字。 若變成了已連接套接字,那麼不僅可以使用sendto、recvfrom函數還可以使用,還可以使用write、read函數進行通信。 |
|
|
|
|||||||||||||||
|
|
|
|
|
|
|