UNIX網路程式設計總結 基礎篇

2021-06-25 10:40:16 字數 1582 閱讀 9430

在網路通訊中客戶—伺服器這種模式可以說是最普遍的,而我們所說的套接字程式設計,就是利用一層在應用層與運輸層的介面,來編寫應用程式,我們的資訊以此在網路中互動。另外在以後的高階部分我們還將看到繞過傳輸層的原始套接字甚至繞過ip層直接讀取鏈路層的幀

1.那麼為什麼套接字提供的是應用層與運輸層間的介面呢?

其實不難理解,應用層提供的是具體的網路應用對於通訊的細節並不了解。另外應用層一般是應用程序,而底下的四層通常是作為系統呼叫的一部分。

那麼運輸層的tcp, udp,sctp有什麼不同呢?

前面兩個我們就不說了,大家都應該很熟悉了,至於sctp,他和tcp一一樣是乙個可靠的傳輸協議,但是他還提供了訊息邊界、傳輸級別多宿支援以及將端頭阻塞減少到最小。這些我們乙個乙個慢慢來。

首先,既然後面兩個有連線的我們就從建立連線開始說起。

tcp的三次握手,我們就不在嘮叨了,至於為什麼需要三次握手。我覺的最直接就是,因為如果兩次握手我們建立的只是一條單方向可行的通路而已。

值得注意的是 syn 裡含有多個tcp選項,較常用的是mss(願意接受的最大分節大小),而另外乙個視窗規模選項。

剛開始我看到這兩個名詞時候我也是有點亂。後來想想了想也就明白了。

這個有點像我們在運貨,mss規定了我們每輛車能裝的貨物大小,而視窗規模就是倉庫有多少的空間可以裝貨物。對於mss的值我們必須知道的是,因為mss的使用16位表示的,所以對於ipv4和不使用特大靜荷選項的ipv6足可以表示任何一種情況,但是如果,是使用了最大淨荷選項的ipv6,那麼會將65495視為「無限「這一特殊值;

接下來是關於tcp斷開連線時的四次握手的time_wait狀態,這個狀態的存在的理由。第一點:實現可靠的tcp連線的終結。我們可以想象一下,如果最後和我們傳送的ack伺服器端沒收到。那麼我們必須重新發多一次。而第二個理由,假設我們斷開了,連線之後,又與之前相同的ip位址與埠建立連線,那麼之前的迷路的資訊就可能會被接收影響通訊。

sctp的握手過程不同於tcp採取的四次握手

值得注意的是ta,tz這個驗證標記,必須在對端傳送的每乙個分組中出現,而cookie c中包含設定與sctp關聯所需的所有狀態,這樣服務端就不必儲存所有關聯的客戶端的資訊。

在完成四次握手之後兩邊都會選擇乙個主目的位址作為通訊的雙方

sctp的關閉使用的是三次握手。

可以看出與tcp的關閉相比,sctp不存在所謂的「半關閉」,也不存在time_wait。

關於ip資料報的大小,需要注意的是ipv6路由器不對資料報分片。同時ipv6有個df位當這個位被設定時主機和路由都不對資料報進行分片

,該技術用於mtu發現,當中間某個路由由於mtu不能**資料時就會向主機傳送乙個icmp報,tcp就會減少資料報大小再重傳,但是遺憾的是在今天的網路中,許多的防火牆丟棄了icmp訊息

對於傳送緩衝區tcp會在緩衝區儲存乙個傳送資料的副本直到收到確認資料的ack才將其刪除,sctp同樣會在緩衝區中儲存資料的副本,

網路程式設計基礎篇

href file e temp msohtml1 01 clip filelist.xml rel file list c s模式 server 根據請求提供服務 1 開啟乙個通訊通道並告知本地計算機,它願意在某一位址和埠上接受客戶請求 2 等待客戶請求到達埠 3 接收到重複服務請求,處理該請求並...

UNIX網路程式設計 基礎套接字程式設計

就像 unix網路程式設計 裡面說的,我們可以將tcp的連線看成乙個 系統,那麼我們的套接字位址結構,就是我們的 裡面號碼,和其他能確定我們身份資訊的集合。其中ipv4的,我們已經很熟悉,還有另外的,在ipv6如果系統支援長度字段,那麼sin6 len常值必須定義,在使用這一結構時我們必須分清到底,...

套接字程式設計基礎 Unix網路程式設計第3章總結

1.套接字位址結構 以下是其posix定義 struct in addr struct sockaddr in在rhel5中,in addr t是無符號32位整數,in.h檔案中包含 typedef unit32 t in addr t posix規範只有sin family,sin port和si...