UNIX網絡編程卷一 筆記 第7章 套接字選項

1     getsockopt和setsockopt函數

套接字選項粗分爲兩大基本類型:一是啓用或禁止某個特性的二元選項,二是取得並返回特定值的選項,參數都是以指針形式傳入的。

2     套接字狀態

下面的套接字選項是從監聽套接字繼承來的:SO_DEBUF、SO_DONTROUTE、SO_KEEPALIVE、SO_LINGER、SO_OOBINLINE、SO_RCVBUF、SO_RCVLOWAT、SO_SNDBUF、SO_SNDLOWAT、TCP_MAXSEG和TCP_NODELAY。

3     通用套接字選項

3.1  SO_BROADCAST選項

只有數據報套接字支持廣播。開啓或禁止進程發送廣播消息的能力。若禁止後發送廣播消息會返回錯誤。

3.2  SO_ERROR選項

內核能以下列方式立即通知進程套接字錯誤:

1.     阻塞在對該套接字的select上。

2.     使用信號驅動I/O,產生SIGIO信號。

只能獲取不能設置,獲取後清零。

進程read但沒有數據返回時,read返回-1並設置errno,有數據時返回數據,write時返回-1並設置errno。隨後so_error都清零。

3.3  SO_KEEPALIVE選項

設置該選項後,如果2小時內該套接字的任一方向上都沒有數據交換,TCP自動給對端發送一個探測分節,會導致以下三種情況之一:

1.     對端響應ACK,一切正常。

2.     對端響應RST,對端已崩潰且已重啓,返回錯誤,關閉套接字。

3.     對端無響應,系統在重複發送多個分節後放棄,返回錯誤,關閉套接字。

修改這個時間可能會影響到主機上其它的進程。用select可檢測到該錯誤。

本選項一般由服務器使用,不過客戶也可使用。服務器也可以自行設置超時,用於清理客戶,如關閉最近活動時間超過某個閾值的連接。

3.4  SO_LINGER選項

指定close面向連接的協議(TCP、SCTP)時如何操作。默認是立即返回,但試圖發送緩衝區中的數據。

有三種情形:

1.     關閉本選項,採用默認設置。

2.     close時丟棄數據,不推薦。

3.     close時若有數據則睡眠,若阻塞則直到數據發送完或超過指定的時間才返回,若非阻塞則直接返回。

設置本選項後,close成功返回只表明數據和FIN已被對端TCP確認,不代表對端進程已讀取數據。不設置的話,對端的確認都收不到。

可用shutdown後read來等待對方FIN(會在對端關閉後返回)。另一個方法是使用應用級確認,服務器接收數據後發送1字節的確認信息,客戶在發送後等待這個確認。

3.5  SO_OOBINLINE選項

開啓時帶外數據將被留在正常的輸入隊列中,此時接收函數的MSG_OOB標誌不能用來讀帶外數據。

3.6  SO_RCVBUF和SO_SNDBUF選項

設置SO_RCVBUF時要在connect或listen前。UDP沒有流量控制,較小的接收緩衝區很容易被接收的數據淹沒,導致新數據報被丟棄。

TCP緩衝區至少應該是相應連接的MSS值的四倍。依據是TCP快速恢復算法的工作機制,它使用3個重複的確認來檢測分節丟失。

管道的容量稱爲帶寬-延遲積,是帶寬和RTT相乘,緩衝區小於這個值的話會降低性能。設置緩衝區大小時應該先獲取當前系統默認值再判斷是否要設置一個不同的值。

3.7  SO_RCVTIMEO和SO_SNDTIMEO選項

設置接收和發送的超時,設置爲0表示禁止。默認是禁止。影響5個輸入函數和5個輸出函數。

3.8  SO_REUSEADDR和SO_REUSEPORT選項

SO_REUSEADDR選項有以下4個功用:

1.     允許監聽套接字綁定一個已使用的端口,如在監聽進程終止後又重啓,此時派生出來的子進程還在爲客戶服務時。不指定的話bind會失敗。所有TCP服務器都應指定本選項。

2.     允許在同一端口上啓動同一服務器的多個實例,只要bind的本地IP不同即可。有些系統不允許對已綁定了通配地址的端口再綁定具體的IP。

3.     允許單個進程綁定同一端口到多個套接字上,只要IP不同。

4.     允許完全重複的綁定,一般僅支持UDP。

4     TCP套接字選項

4.1  TCP_MAXSEG選項

允許獲取或設置最大分節大小MSS。並非所有系統上應用進程都可設置該選項。

4.2  TCP_NODELAY選項

開啓將禁止TCP的Nagle算法。Nagle算法是指,如果連接上有數據待確認,後續待發送的小於MSS的分組就會被延遲,等待現有數據被確認,目的是減少WAN上小分組的數目。

對於小分組頻繁的應用,如果WAN上的確認時間較長,會因此算法而感受到明顯的延遲。

Nagle算法常與ACK延滯算法聯合使用。該算法將對數據的確認ACK延滯一段時間發送,如果這段時間內自身有數據發送到對端,就可以捎帶着ACK,省掉一個分節。

若服務器不立即回送數據,客戶會因此產生延遲,此時需要啓動TCP_NODELAY選項。

如果客戶向服務器發送的數據是分多次發送的,發送完第一片後,因爲數據未確認,客戶的後面幾片都會因Nagle算法而延遲,服務器因爲沒有接收到全部數據,不能立即回送數據,對第一片的確認因ACK延滯算法而延遲。此時有三種方法修正:

1.     用writev,一次發送多組數據。

2.     將所有數據複製到一個緩衝區中,再一次發送。

3.     用TCP_NODELAY,最不可取的方法。

5     fcntl函數

fcntl提供了與網絡編程相關的如下特性:

1.     非阻塞I/O,設置O_NONBLOCK。

2.     信號驅動I/O,設置O_ASYNC。

3.     F_SETOWN設置SIGIO和SIGURG信號的套接字屬主(pid或gid)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章