此博文是學習unp(unix network programming)後的讀書筆記,供以後自己翻閱回顧知識。
tcp、udp概述
在前面《計算機網路與tcp/ip》欄目下已經介紹過一些關於tcp、udp的相關知識tcp/ip(三):傳輸層tcp與udp,這裡只是簡單從unix網路程式設計的角度介紹tcp、udp協議。
我們都知道udp缺乏可靠性、無連線的,面向資料報的協議,如果想確保資料報到達目的地,必須自己在應用層實現一些特性:對端的確定、本端的超時和重傳等。udp面向報文的特性,使得udp不像tcp中可以通過設定mss(最大分節大小)避免ip層分片,udp中沒有相應的措施避免在ip層中進行分片,所以在使用udp中,應該控制傳輸資料報的大小,避免分片,但是資料報太小,利用率低,應該合理規劃。
相反,tcp提供可靠的傳輸服務、流量控制、面向位元組流、連線的協議, 通過超時重傳、確認等手段實現可靠的傳輸服務,tcp中含有動態估算客戶和伺服器之間的往返時間(round-trip time rtt)的演算法,知道等待確認需要多少時間。tcp中對所傳送資料中的每個位元組進行排序(序列號), 例如乙個應用寫2048位元組到乙個tcp套接字,導致tcp傳送2個分節,乙個分節傳送序列號為1~1024的資料,乙個分節傳送序列號為1025~2048的資料, 接收端會對資料的序列號進行排序組合(各個分節可能非順序到達目的端),保證資料的正確性,同時如果分節在傳輸的過程中丟失,傳送端應該超時重傳,對於重複的分節,接收端有能力丟棄重複的分節。tcp總是告知對端任何時刻它一次能從對端接收多少位元組的資料,這稱為通告視窗,該視窗指出接收緩衝區中當前可用的空間量,從而保證傳送端傳送的資料不會使接收緩衝區溢位。通過此種方式提供流量的控制。
tcp連線的建立和終止
通常伺服器端通過呼叫socket,bind和listen實現「被動開啟」, 客戶端通過呼叫socket,connect實現「主動開啟」,tcp通過三次握手建立連線
終止乙個tcp連線需要4個分節:
tcp的11個狀態轉換圖:
tcp的同時開啟和同時關閉:
time_wait狀態兩個存在理由:(詳細見)
tcp埠號和併發伺服器
tcp無法僅僅通過檢視目的埠號來分離外來的分節到不同的端點,必須檢視套接字對的所有4個元素才能確定由哪個端點來接收某個到達的分節。
對於乙個多宿主機監聽21號埠的套接字,如果不設定監聽端介面的ip位址,則是萬用字元*表示,表示監聽到達此主機的任意ip位址(伺服器的ip位址),在unix中可以通過soaddr_any指定,在呼叫bind前把套接字的位址結構中的ip位址字段設定為 soaddr_any;
當客戶主機啟動乙個客戶執行主動開啟,指定伺服器的ip位址為12.106.32.254,伺服器端的通過呼叫fork生成子程序進行處理,此時服務端有兩個套接字,乙個是監聽套接字,乙個是和客戶連線的套接字:
當有多個客戶請求的時候,套接字對的情況如下:
所有目的埠號為21 的其他tcp分節都被遞送到監聽套接字的父程序。
快取區大小和限制
每乙個tcp套接字都有乙個傳送快取區,可以通過so_sndbuf套接字選項來更改快取區的大小,當某個程序中呼叫write時,核心從該應用程序的快取區中複製所有資料到所寫套接字的傳送快取區中,如果快取區的容不下應用程序的所有資料(傳送快取區的資料大小太小或者傳送快取區存在資料),此時write會阻塞,直到傳送快取區中有空間存應用程序傳送的資料。當應用程序從write返回只是說明可以重新使用原來的應用程序的快取區,不代表對端接收到資料。
這裡的輸出佇列需要注意的是,如果輸出佇列滿了,新到的分組將會丟棄,同時沿協議棧向上返回乙個錯誤,在某個時刻重傳這個分節。套接字快取區中的資料,直到接收到對端的確認,才會刪除資料。
對於udp來說,核心並沒有維護乙個套接字傳送快取區,但是依然可以通過so_sndbuf設定傳送快取區的大小,如果應用程式寫乙個大於快取區大小的資料報將返回emsgsize錯誤。而實際不存在套接字快取區,因為udp中不需要處理超時重傳,同理,write返回成功不能說明對端接收到資料,只能說明所寫的資料報加入到資料鏈路層的輸出佇列,同時如果佇列已滿,則丟棄資料報,核心可能返回錯誤也可能不返回錯誤,具體依賴於實現。
網路程式設計(一)網路程式設計入門
網路是計算機通訊的基礎,網路程式設計是學習計算機網路最佳方法,通常標準的計算機網路通訊協議有udp和tcp兩種 此處不包含微計算機網路通訊協議 如can等 首先小猿引入幾個面試常見的問題。1 網路程式設計三要素是什麼?答 網路程式設計的三要素是,ip,傳輸協議,埠號。2 網路模型有幾種?如何理解?答...
網路程式設計(一) 網路基礎之一
今天開始學習網路程式設計,當然還是要從網路基礎學起,首先我們來熟悉一下tcp ip模型與osi模型之間的對應關係 一.tcp ip四層模型 tcp ip是 一組協議的代名詞,它還包括許多協議,組成了tcp ip協議簇。tcp ip協議簇 分為四層,ip位於協議簇的第 二層 對應osi的第三層 tcp...
Windows程式設計 網路概念(一) 網路分層
ps 這些文字是參考的unp寫的,但是網路分層的原理都是一樣的,並且懶得專門去寫乙個關於windows的了,所以就這樣 網路是分層的,程式設計師關心的是以下4層 在談論網路資料的時候,如果說到幀,則應該知道是乙太網層。我們一般關心的是tcp 分節,應用層 訊息。tcp ip協議不僅僅指的是tcp協議...