unix 網絡編程 第七章

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)。

相關文章
相關標籤/搜索