udp是乙個簡單的、不可靠的資料報協議,tcp是乙個複雜、可靠的位元組流協議。sctp也是個可靠的傳輸協議,但它還提供訊息邊界等服務。
應用程序往乙個udp套接字寫入乙個訊息,該訊息隨後被封裝到乙個udp資料報,它又被封裝到乙個ip資料報,然後傳送。udp不保證資料報是否到達、先後順序、到達次數。
每個udp資料報都附帶乙個長度,這點和tcp不同,後者是位元組流協議。乙個udp伺服器可以用同乙個udp套接字接收若干個不同客戶的資料,也能向不同的客戶傳送資料。udp可以是全雙工的。
tcp是基於連線的,還提供了可靠性。這種可靠性是指要麼收到傳送成功的確認,要麼向客戶返回錯誤資訊。tcp提供動態估算往返時間(rtt)、流量控制(只接收可容納的大小)、全雙工連線。
sctp在客戶和伺服器間提供關聯。乙個關聯指代兩個系統間的一次通訊,因為sctp支援多宿,涉及的不止兩個位址。sctp是面向訊息的,每條記錄的長度也會傳遞過來。
兩個端點間sctp提供多個流,乙個流的訊息丟失不會阻塞其他流。tcp只有乙個流,任何丟失都會阻塞後面的訊息。
建立乙個tcp連線時:
1. 伺服器listen。
2. 客戶connect,傳送乙個syn,此分節中不帶資料,只帶此次連線中客戶端使用的初始序列號。
3. 伺服器傳送ack+syn(乙個分節),含有伺服器端的初始序列號。
4. 客戶ack。
乙個syn可以含有多個tcp選項,常用選項有:
1. mss選項。通告對端它接收的最大分節大小。不同方向可以有不同的mss值。
2. 視窗規模選項。tcp的最大視窗大小是65535,本選項通過指定左移視窗大小若干位來擴大視窗大小。只有在兩端都支援此選項時才啟用。
3. 時間戳。網路程式設計人員無需考慮此選項。
tcp終止乙個連線需要4個分節:
1. 應用程序close,主動關閉,傳送fin,表達資料傳送完畢。
2. 對端被動關閉,ack,並將eof放於使用者程序的緩衝區末尾。
3. 被動端程序呼叫close,傳送fin。
4. 主動端ack。
步驟2和3可能被合併為乙個分節。
步驟2和3之間,主動端仍可從被動端獲取資料,稱為半關閉。
fin都是在close時才發。
通常是客戶程式主動關閉,但http協議中伺服器主動關閉。
tcp因為需要連線、關閉和應答,會比udp使用更多的傳輸分節,但udp缺少可靠保證。有些應用需要交換的資料很少,因此適合用udp。
主動關閉端會經歷此狀態,持續時間是最長分節生命斯(msl)的兩倍。msl是任何ip資料報能在網際網路上存活的最長時間。
假設乙個tcp分節在迷途時傳送端重發了此分節,一段時間後迷途的分節到達接收端時就會出現重複的分節。
time_wait狀態有兩個存在的理由:
1. 可靠地實現tcp全雙工連線的終止。
如果最後乙個ack丟失了,客戶端要等待伺服器重發ack,以保證徹底終止兩個方向的資料流。
2. 允許老的重複分節在網路中消逝。
兩倍的msl時間足以讓兩個方向的分組最多存活msl秒即被丟棄。
埠號被劃分成以下3段:
1. 0~1023是眾所周知的埠。可能的話,tcp、udp、sctp的相同服務使用相同的埠號。
2. 1024~49151是已登記的埠。可能的話,tcp、udp埠號也相同。
3. 49152~65535是動態的或私用的埠,即臨時埠。
套接字對
乙個tcp連線的套接字對是乙個四元組:本地ip、本地埠、外地ip、外地埠。
可以用so_sndbuf選項來更改傳送緩衝區的大小。
對套接字的write成功返回只表示我們可以重新使用原來的應用程序緩衝區,不表明對端已接收到資料。接收到對端ack後,本端tcp才能丟棄緩衝區中已確認的資料。
可以用so_sndbuf選項更改緩衝區大小,此大小僅是乙個大小上限。udp無需真正的傳送緩衝區。對udp的write成功返回只表示資料已被加入資料鏈路層的輸出佇列。如果有錯誤的話不一定會通知應用程式。
《UNIX網路程式設計 卷2》 筆記 管道
管道是最初的unix ipc形式,它的侷限性在於沒有名字,只能在有親緣關係的程序間使用。後來,fifo出現了,fifo也稱為有名管道。管道和fifo都使用read和write函式訪問。include int pipe int fd 2 管道由pipe函式建立,返回兩個描述符 fd 0 用來讀,fd ...
《UNIX網路程式設計 卷1》 筆記 UNIX域協議
unix域協議並不是乙個實際的協議族,而是在單個主機上客戶程序和伺服器程序之間通訊的一種方法。unix域使用的套接字結構如下 struct sockaddr un int main int argc,char argv 執行結果如下 可以看到繫結的路徑名 tmp 123 現在是乙個套接字檔案。uni...
UNIX網路程式設計卷二 筆記 Posix訊息佇列
每個訊息都是乙個有優先順序的記錄,程序寫入訊息前,不需要有其它程序在等待訊息。訊息佇列具有隨核心的持續性。posix 訊息佇列與 system v 訊息佇列的兩個主要區別 1.posix 讀返回最高優先順序的最早訊息,system v 返回指定優先順序的最早訊息。2.向空佇列放置乙個訊息時,posi...