UNIX網路程式設計(二)

2021-10-10 08:52:53 字數 2139 閱讀 3808

udp不保證udp資料報會到達其最終目的地,不保證各個資料報的先後順序跨越網路後保持不變,也不保證每個資料報只到達一次。

tcp提供客戶與伺服器之間的連線,還提供了可靠性

建立乙個tcp連線會發生三次握手

伺服器必須準備好接受外來的連線。這通常通過socket、bind、listen這三個函式來完成。我們稱之為被動開啟

客戶通過呼叫connect發起主動開啟。這導致客戶tcp傳送乙個syn(同步)分組

伺服器必須確認(ack)客戶的syn,同時自己也得傳送乙個syn分組。

客戶必須確認伺服器的syn。

正常終止乙個tcp連線需要四次揮手

某個應用程序首先呼叫close,我們稱該端執行主動關閉,該端的tcp於是傳送乙個fin分組,表示資料傳送完畢。

接收到這個fin的對端執行被動關閉。這個fin由tcp確認

一段時間後,接收到這個檔案結束符的應用程序將呼叫close關閉它的套接字。這導致它的tcp也傳送乙個fin

接收這個最終fin的原傳送端tcp(即執行主動關閉的一端)確認這個fin。

為什麼連線的時候是三次握手,關閉的時候卻是四次揮手?

答:因為當伺服器收到客戶端的syn連線請求分組後,可以直接傳送syn+ack分組。但是關閉連線時,當伺服器收到fin分組時,很可能並不會立即關閉socket,只有等到客戶端所有的分組都傳送完了,客戶端才能傳送fin分組,因此不能一起傳送。故需要四步揮手。

tcp在互動的過程中會出現一些意想不到的情況,導致tcp無法按照正常的四次揮手來釋放連線,如果此時不通過其他的方式來釋放tcp連線的話,這個tcp連線將會一直存在,占用系統的部分資源。在這種情況下,我們就需要有一種能夠釋放tcp連線的機制,這種機制就是tcp的rst分組。

tcp異常終止的常見情形:

客戶端嘗試與伺服器未對外提供服務的埠建立tcp連線,伺服器將會直接向客戶端傳送rst分組。

客戶端和伺服器的某一方在互動的過程中發生異常(如程式崩潰等),該方系統將向對端傳送tcp rst分組,告之對方釋放相關的tcp連線。

接收端收到tcp分組,但是發現該tcp的分組,並不在其已建立的tcp連線列表內,則其直接向對端傳送rst分組。

在互動的雙方中的某一方長期未收到來自對方的確認分組,則其在超出一定的重傳次數或時間後,會主動向對端傳送rst分組釋放該tcp連線。

有些應用開發者在設計應用系統時,會利用rst分組快速釋放已經完成資料互動的tcp連線,以提高業務互動的效率

該端點停留在這個狀態的持續時間是最長分節生命期(msl)兩倍,有時候稱為2msl。

msl是任何ip資料報能夠在網際網路中存活的最長時間。

time_wait狀態有兩個存在的理由:

可靠的實現tcp全雙工連線的終止

允許老的重複分節在網路中消逝。

當伺服器接收並接受第乙個客戶的連線時,它fork乙個自身的副本,讓子程序來處理該客戶的請求。

假設在客戶主機上另有乙個客戶請求連線到用乙個伺服器。客戶主機的tcp為這個新客戶的套接字分配乙個未使用的臨時埠。

tcp無法僅僅通過檢視目的埠號來分離外來的分節到不同端點。它必須檢視套接字對的所有4個元素才能確定由哪個端點接收某個到達的分節。

UNIX網路程式設計 鎖(二)

1.3 訊號量讀寫鎖的實現 此部落格是關於一篇訊號量的文章,訊號量提供程序間互斥,很方便。用mutex來實現訊號量的功能,必須將mutex建立在共享記憶體上才能實現。所以當需要執行緒間互斥的時候,最好是用mutex 當用程序間互斥的時候,用sem。歸結起來,mutex直接用到程序上,顯得無用 sem...

UNIX網路程式設計

在unix network programming 的 3.7 inet pton and inet ntop functions 中提到中有如下兩個巨集定義 define inet addrstrlen 16 for ipv4 dotted decimal define inet6 addrstr...

unix網路程式設計

任何tcp的實現都需要為msl選擇乙個合適的值,rfc的建議值是2分鐘。分組可能出現迷途,若迷途分組在msl中找到路,造成重複,tcp必須修復 time wait存在的理由 可靠的實現全雙工的連線和終止 考慮最終ack丟失的情況,允許老的重複分組在網路中消逝 tcp的化生身現象,因為time wai...