基本通訊端選項
1. SO_BROADCAST
開啟或禁止進程發送廣播訊息的能力。
2. SO_DEBUG
開啟該選項後,核心將為TCP在該通訊端發送和接收的所有分組保留詳細跟蹤資訊。這些資訊儲存在核心的某個環型 緩衝區中
3. SO_KEEPALIVE
如果兩小時內在該通訊端的任一方向上都沒有資料交換,TCP就自動給對端發送一個保持存活探測分節,它導致以下三種情況之一
3.1 對端以期望的ACK響應,應用進程得不到通知,在右經過仍無動靜的2小時後,TCP將發出另一個探測分節
3.2 對端以RST響應,它告知本端TCP,對端已崩潰且已重新啟動
3.3 對端對保持存活探測分節沒有任何響應。
4. SO_LINGER
本選項指定close函數對連線導向的協議如何操作。預設操作close是立即返回。但是如果有資料殘留在通訊端發送緩衝區中,系統將試著把這些資料發送給對端
linger的資料結構,在<sys/socket.h>中定義
struct linger
{
int l_onoff; //0-off nonzero-on
int l_linger;
};
4.1 如果l_onoff為0,那麼關閉本選項,l_lingger的值被忽略,close立即返回
4.2 如果l_onoff為非0其l_linger為0,那麼當close某個串連時TCP將中止該串連。這就是說TCP將丟棄保留在通訊端發送緩衝取中的任何資料,並發送一個RST給對端,而沒有通常的四分組串連終止序列,這樣避免了TIME_WAIT狀態
4.3 如果l_onoff為非0且l_linger也為非0,那麼當通訊端關閉時核心將拖延一段時間。這就是說如果在通訊端發送緩衝區中仍殘留有資料,那麼進程將被投入睡眠,知道所有資料都已發送完且均被對方確認或者延滯時間已到。
5. SO_RCVLOWAT和SO_SNDLOWAT
每個通訊端有一個接收低水位和一個發送低水位。他們由select函數使用。接收低水位標記是讓select返回"可讀"時通訊端接收緩衝區中所需的資料量。對於,TCP,UDP,SCTP,其預設值為1。發送低水位標記是讓select返回"可寫"時通訊端發送緩衝區中所需的可用空間。對於TCP通訊端,其預設值常為2048.而UDP通訊端的發送緩衝區中可用空間的位元組數從不改變(因為UDP從不為由應用程式傳遞給他的資料報保留副本),只要一個UDP通訊端的發送緩衝區大小大於該通訊端的低水位標記,該UDP通訊端總是可寫
6 SO_RCVTIMEO和SO_SNDTIMEO
這兩個選項允許我們給通訊端的接收和發送設定一個逾時值。發送逾時影響
write, send, sendto, sendmsg
接收逾時影響:read,recvfrom, recvmsg
7 SO_REUSERADDR和SO_REUSERPORT
7.1 SO_REUSEADDR,允許啟動一個監聽伺服器並捆綁其眾所周知連接埠,即使以前建立的將該連接埠用作他們的本地連接埠的串連仍存在
7.2 SO_REUSEADDR 允許在同一個連接埠上啟動同一伺服器的多個執行個體,只要每個執行個體捆綁一個不同的本地IP地址
7.3 SO_REUSEADDR允許單個進程捆綁同一個連接埠到多個通訊端上,只要每次捆綁指定不同的本地IP地址即可
7.4 SO_REUSEPORT選項允許完全重複的捆綁,不過只有在想要捆綁同一IP地址河段口的每個通訊端鬥志頂了本通訊端選項才行
建議:
1. 在所有TCP伺服器程式中,在調用bind之前設定SO_REUSRADDR通訊端選項
2. 當編寫一個可在同一時刻在同一主機上運行多次的躲避應用程式時,設定SO_REUSRADDR通訊端選項,並將所參加多播組的地址作為本地IP地址捆綁
8. SO_RCVBUF和SO_SNDBUF
每個通訊端都有一個發送緩衝區和一個接收緩衝區。接收緩衝區被TCP,UDP和SCTP用來儲存接收到的資料,直到應用程式進程來讀取,大小限定為TCP通告對端的視窗大小。由於TCP有流量控制,所以接收緩衝區不可能溢出。但是UDP是沒有流量控制的,較快的發送端可以很容易的淹沒較慢的接收端,導致接收端的UDO丟棄資料報。
TCP通訊端選項
1. TCP_MAXSEG
允許我們設定或擷取TCP串連的最大分節大小(MSS),傳回值是我們的TCP可以發送給對端的最大資料量
2. TCP_NODELAY
開啟本選項將禁止TCP的Nagle演算法,預設情況下該演算法是啟動的