青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-5  評(píng)論-1  文章-0  trackbacks-0

int setsockopt(
  SOCKET s,
  int level,
  int optname,
  const char* optval,
  int optlen
);

s(套接字): 指向一個(gè)打開(kāi)的套接口描述字
 level:(級(jí)別): 指定選項(xiàng)代碼的類(lèi)型。
SOL_SOCKET: 基本套接口 
IPPROTO_IP: IPv4套接口 
IPPROTO_IPV6: IPv6套接口 
IPPROTO_TCP: TCP套接口 
optname(選項(xiàng)名): 選項(xiàng)名稱(chēng) 
optval(選項(xiàng)值): 是一個(gè)指向變量的指針 類(lèi)型:整形,套接口結(jié)構(gòu), 其他結(jié)構(gòu)類(lèi)型:linger{}, timeval{ } 
optlen(選項(xiàng)長(zhǎng)度) :optval 的大小 

返回值:標(biāo)志打開(kāi)或關(guān)閉某個(gè)特征的二進(jìn)制選項(xiàng)
[/code:1:59df4ce128]

 

======================================================================== 
SOL_SOCKET 
------------------------------------------------------------------------ 
SO_BROADCAST 允許發(fā)送廣播數(shù)據(jù) int 
適用於 UDP socket。其意義是允許 UDP socket 「廣播」(broadcast)訊息到網(wǎng)路上。

SO_DEBUG 允許調(diào)試 int 

SO_DONTROUTE 不查找路由 int 

SO_ERROR 獲得套接字錯(cuò)誤 int 

SO_KEEPALIVE 保持連接 int 
檢測(cè)對(duì)方主機(jī)是否崩潰,避免(服務(wù)器)永遠(yuǎn)阻塞于TCP連接的輸入。 設(shè)置該選項(xiàng)后,如果2小時(shí)內(nèi)在此套接口的任一方向都沒(méi)有數(shù)據(jù)交換,TCP就自動(dòng)給對(duì)方 發(fā)一個(gè)保持存活探測(cè)分節(jié)(keepalive probe)。這是一個(gè)對(duì)方必須響應(yīng)的TCP分節(jié).它會(huì)導(dǎo)致以下三種情況: 對(duì)方接收一切正常:以期望的ACK響應(yīng)。2小時(shí)后,TCP將發(fā)出另一個(gè)探測(cè)分節(jié)。 對(duì)方已崩潰且已重新啟動(dòng):以RST響應(yīng)。套接口的待處理錯(cuò)誤被置為ECONNRESET,套接 口本身則被關(guān)閉。 對(duì)方無(wú)任何響應(yīng):源自berkeley的TCP發(fā)送另外8個(gè)探測(cè)分節(jié),相隔75秒一個(gè),試圖得到 一個(gè)響應(yīng)。在發(fā)出第一個(gè)探測(cè)分節(jié)11分鐘15秒后若仍無(wú)響應(yīng)就放棄。套接口的待處理錯(cuò) 誤被置為ETIMEOUT,套接口本身則被關(guān)閉。如ICMP錯(cuò)誤是“host unreachable(主機(jī)不 可達(dá))”,說(shuō)明對(duì)方主機(jī)并沒(méi)有崩潰,但是不可達(dá),這種情況下待處理錯(cuò)誤被置為 EHOSTUNREACH。 



SO_DONTLINGER 若為真,則SO_LINGER選項(xiàng)被禁止。
SO_LINGER 延遲關(guān)閉連接 struct linger 
上面這兩個(gè)選項(xiàng)影響close行為
選項(xiàng) 間隔 關(guān)閉方式 等待關(guān)閉與否
SO_DONTLINGER 不關(guān)心 優(yōu)雅 否
SO_LINGER 零 強(qiáng)制 否
SO_LINGER 非零 優(yōu)雅 是
若設(shè)置了SO_LINGER(亦即linger結(jié)構(gòu)中的l_onoff域設(shè)為非零,參見(jiàn)2.4,4.1.7和4.1.21各節(jié)),并設(shè)置了零超時(shí)間隔,則closesocket()不被阻塞立即執(zhí)行,不論是否有排隊(duì)數(shù)據(jù)未發(fā)送或未被確認(rèn)。這種關(guān)閉方式稱(chēng)為“強(qiáng)制”或“失效”關(guān)閉,因?yàn)樘捉涌诘奶撾娐妨⒓幢粡?fù)位,且丟失了未發(fā)送的數(shù)據(jù)。在遠(yuǎn)端的recv()調(diào)用將以WSAECONNRESET出錯(cuò)。
若設(shè)置了SO_LINGER并確定了非零的超時(shí)間隔,則closesocket()調(diào)用阻塞進(jìn)程,直到所剩數(shù)據(jù)發(fā)送完畢或超時(shí)。這種關(guān)閉稱(chēng)為“優(yōu)雅的”關(guān)閉。請(qǐng)注意如果套接口置為非阻塞且SO_LINGER設(shè)為非零超時(shí),則closesocket()調(diào)用將以WSAEWOULDBLOCK錯(cuò)誤返回。
若在一個(gè)流類(lèi)套接口上設(shè)置了SO_DONTLINGER(也就是說(shuō)將linger結(jié)構(gòu)的l_onoff域設(shè)為零;參見(jiàn)2.4,4.1.7,4.1.21節(jié)),則closesocket()調(diào)用立即返回。但是,如果可能,排隊(duì)的數(shù)據(jù)將在套接口關(guān)閉前發(fā)送。請(qǐng)注意,在這種情況下WINDOWS套接口實(shí)現(xiàn)將在一段不確定的時(shí)間內(nèi)保留套接口以及其他資源,這對(duì)于想用所以套接口的應(yīng)用程序來(lái)說(shuō)有一定影響。



SO_OOBINLINE 帶外數(shù)據(jù)放入正常數(shù)據(jù)流,在普通數(shù)據(jù)流中接收帶外數(shù)據(jù) int 

SO_RCVBUF 接收緩沖區(qū)大小 int 
設(shè)置接收緩沖區(qū)的保留大小
與 SO_MAX_MSG_SIZE 或TCP滑動(dòng)窗口無(wú)關(guān),如果一般發(fā)送的包很大很頻繁,那么使用這個(gè)選項(xiàng)

SO_SNDBUF 發(fā)送緩沖區(qū)大小 int 
設(shè)置發(fā)送緩沖區(qū)的保留大小
與 SO_MAX_MSG_SIZE 或TCP滑動(dòng)窗口無(wú)關(guān),如果一般發(fā)送的包很大很頻繁,那么使用這個(gè)選項(xiàng)
每個(gè)套接口都有一個(gè)發(fā)送緩沖區(qū)和一個(gè)接收緩沖區(qū)。 接收緩沖區(qū)被TCP和UDP用來(lái)將接收到的數(shù)據(jù)一直保存到由應(yīng)用進(jìn)程來(lái)讀。 TCP:TCP通告另一端的窗口大小。 TCP套接口接收緩沖區(qū)不可能溢出,因?yàn)閷?duì)方不允許發(fā)出超過(guò)所通告窗口大小的數(shù)據(jù)。 這就是TCP的流量控制,如果對(duì)方無(wú)視窗口大小而發(fā)出了超過(guò)宙口大小的數(shù)據(jù),則接 收方TCP將丟棄它。 UDP:當(dāng)接收到的數(shù)據(jù)報(bào)裝不進(jìn)套接口接收緩沖區(qū)時(shí),此數(shù)據(jù)報(bào)就被丟棄。UDP是沒(méi)有 流量控制的;快的發(fā)送者可以很容易地就淹沒(méi)慢的接收者,導(dǎo)致接收方的UDP丟棄數(shù)據(jù)報(bào)。



SO_RCVLOWAT 接收緩沖區(qū)下限 int 
SO_SNDLOWAT 發(fā)送緩沖區(qū)下限 int 
每個(gè)套接口都有一個(gè)接收低潮限度和一個(gè)發(fā)送低潮限度。它們是函數(shù)selectt使用的, 接收低潮限度是讓select返回“可讀”而在套接口接收緩沖區(qū)中必須有的數(shù)據(jù)總量。 ——對(duì)于一個(gè)TCP或UDP套接口,此值缺省為1。發(fā)送低潮限度是讓select返回“可寫(xiě)” 而在套接口發(fā)送緩沖區(qū)中必須有的可用空間。對(duì)于TCP套接口,此值常缺省為2048。 對(duì)于UDP使用低潮限度, 由于其發(fā)送緩沖區(qū)中可用空間的字節(jié)數(shù)是從不變化的,只要 UDP套接口發(fā)送緩沖區(qū)大小大于套接口的低潮限度,這樣的UDP套接口就總是可寫(xiě)的。 UDP沒(méi)有發(fā)送緩沖區(qū),只有發(fā)送緩沖區(qū)的大小。

SO_RCVTIMEO 接收超時(shí) struct timeval 
SO_SNDTIMEO 發(fā)送超時(shí) struct timeval 
SO_REUSERADDR 允許重用本地地址和端口 int 
充許綁定已被使用的地址(或端口號(hào)),可以參考bind的man

SO_EXCLUSIVEADDRUSE
獨(dú)占模式使用端口,就是不充許和其它程序使用SO_REUSEADDR共享的使用某一端口。
在確定多重綁定使用誰(shuí)的時(shí)候,根據(jù)一條原則是誰(shuí)的指定最明確則將包遞交給誰(shuí),而且沒(méi)有權(quán)限之分,也就是說(shuō)低級(jí)權(quán)限的用戶是可以重綁定在高級(jí)權(quán)限如服務(wù)啟動(dòng)的端口上的,這是非常重大的一個(gè)安全隱患,
如果不想讓自己程序被監(jiān)聽(tīng),那么使用這個(gè)選項(xiàng)

SO_TYPE 獲得套接字類(lèi)型 int 
SO_BSDCOMPAT 與BSD系統(tǒng)兼容 int 











========================================================================== 
IPPROTO_IP 
-------------------------------------------------------------------------- 
IP_HDRINCL 在數(shù)據(jù)包中包含IP首部 int 
   這個(gè)選項(xiàng)常用于黑客技術(shù)中,隱藏自己的IP地址

IP_OPTINOS IP首部選項(xiàng) int 
IP_TOS 服務(wù)類(lèi)型 
IP_TTL 生存時(shí)間 int 

以下IPV4選項(xiàng)用于組播
IPv4 選項(xiàng) 數(shù)據(jù)類(lèi)型 描 述
  IP_ADD_MEMBERSHIP struct ip_mreq 加入到組播組中
  IP_ROP_MEMBERSHIP struct ip_mreq 從組播組中退出
  IP_MULTICAST_IF struct ip_mreq 指定提交組播報(bào)文的接口
  IP_MULTICAST_TTL u_char 指定提交組播報(bào)文的TTL
  IP_MULTICAST_LOOP u_char 使組播報(bào)文環(huán)路有效或無(wú)效
在頭文件中定義了ip_mreq結(jié)構(gòu):
[code:1:63724de67f]
struct ip_mreq {
struct in_addr imr_multiaddr; /* IP multicast address of group */
struct in_addr imr_interface; /* local IP address of interface */
};
[/code:1:63724de67f]
若進(jìn)程要加入到一個(gè)組播組中,用soket的setsockopt()函數(shù)發(fā)送該選項(xiàng)。該選項(xiàng)類(lèi)型是ip_mreq結(jié)構(gòu),它的第一個(gè)字段imr_multiaddr指定了組播組的地址,第二個(gè)字段imr_interface指定了接口的IPv4地址。
  IP_DROP_MEMBERSHIP
  該選項(xiàng)用來(lái)從某個(gè)組播組中退出。數(shù)據(jù)結(jié)構(gòu)ip_mreq的使用方法與上面相同。
  IP_MULTICAST_IF
  該選項(xiàng)可以修改網(wǎng)絡(luò)接口,在結(jié)構(gòu)ip_mreq中定義新的接口。
  IP_MULTICAST_TTL
  設(shè)置組播報(bào)文的數(shù)據(jù)包的TTL(生存時(shí)間)。默認(rèn)值是1,表示數(shù)據(jù)包只能在本地的子網(wǎng)中傳送。
  IP_MULTICAST_LOOP
  組播組中的成員自己也會(huì)收到它向本組發(fā)送的報(bào)文。這個(gè)選項(xiàng)用于選擇是否激活這種狀態(tài)。


 無(wú)雙 回復(fù)于:2003-05-08 21:21:52

IPPRO_TCP 
-------------------------------------------------------------------------- 
TCP_MAXSEG TCP最大數(shù)據(jù)段的大小 int 
獲取或設(shè)置TCP連接的最大分節(jié)大小(MSS)。返回值是我們的TCP發(fā)送給另一端的最大 數(shù)據(jù)量,它常常就是由另一端用SYN分節(jié)通告的MSS,除非我們的TCP選擇使用一個(gè)比 對(duì)方通告的MSS小些的值。如果此值在套接口連接之前取得,則返回值為未從另·—端 收到Mss選項(xiàng)的情況下所用的缺省值。小于此返回值的信可能真正用在連接上,因?yàn)槠?#160;如說(shuō)使用時(shí)間戳選項(xiàng)的話,它在每個(gè)分節(jié)上占用12字節(jié)的TCP選項(xiàng)容量。我們的TcP將 發(fā)送的每個(gè)分節(jié)的最大數(shù)據(jù)量也可在連接存活期內(nèi)改變,但前提是TCP要支持路徑MTU 發(fā)現(xiàn)功能。如果到對(duì)方的路徑改變了,此值可上下調(diào)整。
TCP_NODELAY 不使用Nagle算法 int 

指定TCP開(kāi)始發(fā)送保持存活探測(cè)分節(jié)前以秒為單位的連接空閑時(shí)間。缺省值至少必須為7200秒,即2小時(shí)。此選項(xiàng)僅在SO_KEPALIVEE套接口選項(xiàng)打開(kāi)時(shí)才有效。

TCP_NODELAY 和 TCP_CORK,
這兩個(gè)選項(xiàng)都對(duì)網(wǎng)絡(luò)連接的行為具有重要的作用。許多UNIX系統(tǒng)都實(shí)現(xiàn)了TCP_NODELAY選項(xiàng),但是,TCP_CORK則是Linux系統(tǒng)所獨(dú)有的而且相對(duì)較新;它首先在內(nèi)核版本2.4上得以實(shí)現(xiàn)。此外,其他UNIX系統(tǒng)版本也有功能類(lèi)似的選項(xiàng),值得注意的是,在某種由BSD派生的系統(tǒng)上的TCP_NOPUSH選項(xiàng)其實(shí)就是TCP_CORK的一部分具體實(shí)現(xiàn)。
TCP_NODELAY和TCP_CORK基本上控制了包的“Nagle化”,Nagle化在這里的含義是采用Nagle算法把較小的包組裝為更大的幀。John Nagle是Nagle算法的發(fā)明人,后者就是用他的名字來(lái)命名的,他在1984年首次用這種方法來(lái)嘗試解決福特汽車(chē)公司的網(wǎng)絡(luò)擁塞問(wèn)題(欲了解詳情請(qǐng)參看IETF RFC 896)。他解決的問(wèn)題就是所謂的silly window syndrome ,中文稱(chēng)“愚蠢窗口癥候群”,具體含義是,因?yàn)槠毡榻K端應(yīng)用程序每產(chǎn)生一次擊鍵操作就會(huì)發(fā)送一個(gè)包,而典型情況下一個(gè)包會(huì)擁有一個(gè)字節(jié)的數(shù)據(jù)載荷以及40個(gè)字節(jié)長(zhǎng)的包頭,于是產(chǎn)生4000%的過(guò)載,很輕易地就能令網(wǎng)絡(luò)發(fā)生擁塞,。 Nagle化后來(lái)成了一種標(biāo)準(zhǔn)并且立即在因特網(wǎng)上得以實(shí)現(xiàn)。它現(xiàn)在已經(jīng)成為缺省配置了,但在我們看來(lái),有些場(chǎng)合下把這一選項(xiàng)關(guān)掉也是合乎需要的。
現(xiàn)在讓我們假設(shè)某個(gè)應(yīng)用程序發(fā)出了一個(gè)請(qǐng)求,希望發(fā)送小塊數(shù)據(jù)。我們可以選擇立即發(fā)送數(shù)據(jù)或者等待產(chǎn)生更多的數(shù)據(jù)然后再一次發(fā)送兩種策略。如果我們馬上發(fā)送數(shù)據(jù),那么交互性的以及客戶/服務(wù)器型的應(yīng)用程序?qū)O大地受益。例如,當(dāng)我們正在發(fā)送一個(gè)較短的請(qǐng)求并且等候較大的響應(yīng)時(shí),相關(guān)過(guò)載與傳輸?shù)臄?shù)據(jù)總量相比就會(huì)比較低,而且,如果請(qǐng)求立即發(fā)出那么響應(yīng)時(shí)間也會(huì)快一些。以上操作可以通過(guò)設(shè)置套接字的TCP_NODELAY選項(xiàng)來(lái)完成,這樣就禁用了Nagle算法。
另外一種情況則需要我們等到數(shù)據(jù)量達(dá)到最大時(shí)才通過(guò)網(wǎng)絡(luò)一次發(fā)送全部數(shù)據(jù),這種數(shù)據(jù)傳輸方式有益于大量數(shù)據(jù)的通信性能,典型的應(yīng)用就是文件服務(wù)器。應(yīng)用Nagle算法在這種情況下就會(huì)產(chǎn)生問(wèn)題。但是,如果你正在發(fā)送大量數(shù)據(jù),你可以設(shè)置TCP_CORK選項(xiàng)禁用Nagle化,其方式正好同TCP_NODELAY相反(TCP_CORK 和 TCP_NODELAY 是互相排斥的)。下面就讓我們仔細(xì)分析下其工作原理。
假設(shè)應(yīng)用程序使用sendfile()函數(shù)來(lái)轉(zhuǎn)移大量數(shù)據(jù)。應(yīng)用協(xié)議通常要求發(fā)送某些信息來(lái)預(yù)先解釋數(shù)據(jù),這些信息其實(shí)就是報(bào)頭內(nèi)容。典型情況下報(bào)頭很小,而且套接字上設(shè)置了TCP_NODELAY。有報(bào)頭的包將被立即傳輸,在某些情況下(取決于內(nèi)部的包計(jì)數(shù)器),因?yàn)檫@個(gè)包成功地被對(duì)方收到后需要請(qǐng)求對(duì)方確認(rèn)。這樣,大量數(shù)據(jù)的傳輸就會(huì)被推遲而且產(chǎn)生了不必要的網(wǎng)絡(luò)流量交換。
但是,如果我們?cè)谔捉幼稚显O(shè)置了TCP_CORK(可以比喻為在管道上插入“塞子”)選項(xiàng),具有報(bào)頭的包就會(huì)填補(bǔ)大量的數(shù)據(jù),所有的數(shù)據(jù)都根據(jù)大小自動(dòng)地通過(guò)包傳輸出去。當(dāng)數(shù)據(jù)傳輸完成時(shí),最好取消TCP_CORK 選項(xiàng)設(shè)置給連接“拔去塞子”以便任一部分的幀都能發(fā)送出去。這同“塞住”網(wǎng)絡(luò)連接同等重要。
總而言之,如果你肯定能一起發(fā)送多個(gè)數(shù)據(jù)集合(例如HTTP響應(yīng)的頭和正文),那么我們建議你設(shè)置TCP_CORK選項(xiàng),這樣在這些數(shù)據(jù)之間不存在延遲。能極大地有益于WWW、FTP以及文件服務(wù)器的性能,同時(shí)也簡(jiǎn)化了你的工作。示例代碼如下:

intfd, on = 1;

/* 此處是創(chuàng)建套接字等操作,出于篇幅的考慮省略*/

setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on)); /* cork */
write (fd, …);
fprintf (fd, …);
sendfile (fd, …);
write (fd, …);
sendfile (fd, …);

on = 0;
setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on)); /* 拔去塞子 */


不幸的是,許多常用的程序并沒(méi)有考慮到以上問(wèn)題。例如,Eric Allman編寫(xiě)的sendmail就沒(méi)有對(duì)其套接字設(shè)置任何選項(xiàng)。

Apache HTTPD是因特網(wǎng)上最流行的Web服務(wù)器,它的所有套接字就都設(shè)置了TCP_NODELAY選項(xiàng),而且其性能也深受大多數(shù)用戶的滿意。這是為什么呢?答案就在于實(shí)現(xiàn)的差別之上。由BSD衍生的TCP/IP協(xié)議棧(值得注意的是FreeBSD)在這種狀況下的操作就不同。當(dāng)在TCP_NODELAY 模式下提交大量小數(shù)據(jù)塊傳輸時(shí),大量信息將按照一次write()函數(shù)調(diào)用發(fā)送一塊數(shù)據(jù)的方式發(fā)送出去。然而,因?yàn)樨?fù)責(zé)請(qǐng)求交付確認(rèn)的記數(shù)器是面向字節(jié)而非面向包(在Linux上)的,所以引入延遲的概率就降低了很多。結(jié)果僅僅和全部數(shù)據(jù)的大小有關(guān)系。而 Linux 在第一包到達(dá)之后就要求確認(rèn),F(xiàn)reeBSD則在進(jìn)行如此操作之前會(huì)等待好幾百個(gè)包。

在Linux系統(tǒng)上,TCP_NODELAY的效果同習(xí)慣于BSD TCP/IP協(xié)議棧的開(kāi)發(fā)者所期望的效果有很大不同,而且在Linux上的Apache性能表現(xiàn)也會(huì)更差些。其他在Linux上頻繁采用TCP_NODELAY的應(yīng)用程序也有同樣的問(wèn)題。


TCP_DEFER_ACCEPT

我們首先考慮的第1個(gè)選項(xiàng)是TCP_DEFER_ACCEPT(這是Linux系統(tǒng)上的叫法,其他一些操作系統(tǒng)上也有同樣的選項(xiàng)但使用不同的名字)。為了理解TCP_DEFER_ACCEPT選項(xiàng)的具體思想,我們有必要大致闡述一下典型的HTTP客戶/服務(wù)器交互過(guò)程。請(qǐng)回想下TCP是如何與傳輸數(shù)據(jù)的目標(biāo)建立連接的。在網(wǎng)絡(luò)上,在分離的單元之間傳輸?shù)男畔⒎Q(chēng)為IP包(或IP 數(shù)據(jù)報(bào))。一個(gè)包總有一個(gè)攜帶服務(wù)信息的包頭,包頭用于內(nèi)部協(xié)議的處理,并且它也可以攜帶數(shù)據(jù)負(fù)載。服務(wù)信息的典型例子就是一套所謂的標(biāo)志,它把包標(biāo)記代表TCP/IP協(xié)議棧內(nèi)的特殊含義,例如收到包的成功確認(rèn)等等。通常,在經(jīng)過(guò)“標(biāo)記”的包里攜帶負(fù)載是完全可能的,但有時(shí),內(nèi)部邏輯迫使TCP/IP協(xié)議棧發(fā)出只有包頭的IP包。這些包經(jīng)常會(huì)引發(fā)討厭的網(wǎng)絡(luò)延遲而且還增加了系統(tǒng)的負(fù)載,結(jié)果導(dǎo)致網(wǎng)絡(luò)性能在整體上降低。
現(xiàn)在服務(wù)器創(chuàng)建了一個(gè)套接字同時(shí)等待連接。TCP/IP式的連接過(guò)程就是所謂“3次握手”。首先,客戶程序發(fā)送一個(gè)設(shè)置SYN標(biāo)志而且不帶數(shù)據(jù)負(fù)載的TCP包(一個(gè)SYN包)。服務(wù)器則以發(fā)出帶SYN/ACK標(biāo)志的數(shù)據(jù)包(一個(gè)SYN/ACK包)作為剛才收到包的確認(rèn)響應(yīng)。客戶隨后發(fā)送一個(gè)ACK包確認(rèn)收到了第2個(gè)包從而結(jié)束連接過(guò)程。在收到客戶發(fā)來(lái)的這個(gè)SYN/ACK包之后,服務(wù)器會(huì)喚醒一個(gè)接收進(jìn)程等待數(shù)據(jù)到達(dá)。當(dāng)3次握手完成后,客戶程序即開(kāi)始把“有用的”的數(shù)據(jù)發(fā)送給服務(wù)器。通常,一個(gè)HTTP請(qǐng)求的量是很小的而且完全可以裝到一個(gè)包里。但是,在以上的情況下,至少有4個(gè)包將用來(lái)進(jìn)行雙向傳輸,這樣就增加了可觀的延遲時(shí)間。此外,你還得注意到,在“有用的”數(shù)據(jù)被發(fā)送之前,接收方已經(jīng)開(kāi)始在等待信息了。
為了減輕這些問(wèn)題所帶來(lái)的影響,Linux(以及其他的一些操作系統(tǒng))在其TCP實(shí)現(xiàn)中包括了TCP_DEFER_ACCEPT選項(xiàng)。它們?cè)O(shè)置在偵聽(tīng)套接字的服務(wù)器方,該選項(xiàng)命令內(nèi)核不等待最后的ACK包而且在第1個(gè)真正有數(shù)據(jù)的包到達(dá)才初始化偵聽(tīng)進(jìn)程。在發(fā)送SYN/ACK包之后,服務(wù)器就會(huì)等待客戶程序發(fā)送含數(shù)據(jù)的IP包。現(xiàn)在,只需要在網(wǎng)絡(luò)上傳送3個(gè)包了,而且還顯著降低了連接建立的延遲,對(duì)HTTP通信而言尤其如此。
這一選項(xiàng)在好些操作系統(tǒng)上都有相應(yīng)的對(duì)等物。例如,在FreeBSD上,同樣的行為可以用以下代碼實(shí)現(xiàn):

/* 為明晰起見(jiàn),此處略去無(wú)關(guān)代碼 */
struct accept_filter_arg af = { "dataready", "" };
setsockopt(s, SOL_SOCKET, SO_ACCEPTFILTER, &af, sizeof(af));
這個(gè)特征在FreeBSD上叫做“接受過(guò)濾器”,而且具有多種用法。不過(guò),在幾乎所有的情況下其效果與TCP_DEFER_ACCEPT是一樣的:服務(wù)器不等待最后的ACK包而僅僅等待攜帶數(shù)據(jù)負(fù)載的包。要了解該選項(xiàng)及其對(duì)高性能Web服務(wù)器的重要意義的更多信息請(qǐng)參考Apache文檔上的有關(guān)內(nèi)容。
就HTTP客戶/服務(wù)器交互而言,有可能需要改變客戶程序的行為。客戶程序?yàn)槭裁匆l(fā)送這種“無(wú)用的”ACK包呢?這是因?yàn)椋琓CP協(xié)議棧無(wú)法知道ACK包的狀態(tài)。如果采用FTP而非HTTP,那么客戶程序直到接收了FTP服務(wù)器提示的數(shù)據(jù)包之后才發(fā)送數(shù)據(jù)。在這種情況下,延遲的ACK將導(dǎo)致客戶/服務(wù)器交互出現(xiàn)延遲。為了確定ACK是否必要,客戶程序必須知道應(yīng)用程序協(xié)議及其當(dāng)前狀態(tài)。這樣,修改客戶行為就成為必要了。
對(duì)Linux客戶程序來(lái)說(shuō),我們還可以采用另一個(gè)選項(xiàng),它也被叫做TCP_DEFER_ACCEPT。我們知道,套接字分成兩種類(lèi)型,偵聽(tīng)套接字和連接套接字,所以它們也各自具有相應(yīng)的TCP選項(xiàng)集合。因此,經(jīng)常同時(shí)采用的這兩類(lèi)選項(xiàng)卻具有同樣的名字也是完全可能的。在連接套接字上設(shè)置該選項(xiàng)以后,客戶在收到一個(gè)SYN/ACK包之后就不再發(fā)送ACK包,而是等待用戶程序的下一個(gè)發(fā)送數(shù)據(jù)請(qǐng)求;因此,服務(wù)器發(fā)送的包也就相應(yīng)減少了。

TCP_QUICKACK

阻止因發(fā)送無(wú)用包而引發(fā)延遲的另一個(gè)方法是使用TCP_QUICKACK選項(xiàng)。這一選項(xiàng)與 TCP_DEFER_ACCEPT不同,它不但能用作管理連接建立過(guò)程而且在正常數(shù)據(jù)傳輸過(guò)程期間也可以使用。另外,它能在客戶/服務(wù)器連接的任何一方設(shè)置。如果知道數(shù)據(jù)不久即將發(fā)送,那么推遲ACK包的發(fā)送就會(huì)派上用場(chǎng),而且最好在那個(gè)攜帶數(shù)據(jù)的數(shù)據(jù)包上設(shè)置ACK 標(biāo)志以便把網(wǎng)絡(luò)負(fù)載減到最小。當(dāng)發(fā)送方肯定數(shù)據(jù)將被立即發(fā)送(多個(gè)包)時(shí),TCP_QUICKACK選項(xiàng)可以設(shè)置為0。對(duì)處于“連接”狀態(tài)下的套接字該選項(xiàng)的缺省值是1,首次使用以后內(nèi)核將把該選項(xiàng)立即復(fù)位為1(這是個(gè)一次性的選項(xiàng))。
在某些情形下,發(fā)出ACK包則非常有用。ACK包將確認(rèn)數(shù)據(jù)塊的接收,而且,當(dāng)下一塊被處理時(shí)不至于引入延遲。這種數(shù)據(jù)傳輸模式對(duì)交互過(guò)程是相當(dāng)?shù)湫偷模驗(yàn)榇祟?lèi)情況下用戶的輸入時(shí)刻無(wú)法預(yù)測(cè)。在Linux系統(tǒng)上這就是缺省的套接字行為。
在上述情況下,客戶程序在向服務(wù)器發(fā)送HTTP請(qǐng)求,而預(yù)先就知道請(qǐng)求包很短所以在連接建立之后就應(yīng)該立即發(fā)送,這可謂HTTP的典型工作方式。既然沒(méi)有必要發(fā)送一個(gè)純粹的ACK包,所以設(shè)置TCP_QUICKACK為0以提高性能是完全可能的。在服務(wù)器方,這兩種選項(xiàng)都只能在偵聽(tīng)套接字上設(shè)置一次。所有的套接字,也就是被接受呼叫間接創(chuàng)建的套接字則會(huì)繼承原有套接字的所有選項(xiàng)。
通過(guò)TCP_CORK、TCP_DEFER_ACCEPT和TCP_QUICKACK選項(xiàng)的組合,參與每一HTTP交互的數(shù)據(jù)包數(shù)量將被降低到最小的可接受水平(根據(jù)TCP協(xié)議的要求和安全方面的考慮)。結(jié)果不僅是獲得更快的數(shù)據(jù)傳輸和請(qǐng)求處理速度而且還使客戶/服務(wù)器雙向延遲實(shí)現(xiàn)了最小化。

posted on 2009-07-29 08:33 yunboy 閱讀(3674) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 網(wǎng)絡(luò)通信

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久夜| 亚洲午夜小视频| 夜夜嗨av一区二区三区网站四季av | 亚洲欧美在线aaa| 国产精品99久久久久久久女警| 亚洲理伦在线| 国产中文一区二区三区| 亚洲福利在线观看| 最新亚洲视频| 国产一区二区三区奇米久涩| 欧美小视频在线| 米奇777超碰欧美日韩亚洲| 欧美午夜电影在线观看| 亚洲一区二区在| 伊人成综合网伊人222| 亚洲国产欧美日韩另类综合| 日韩一级视频免费观看在线| 亚洲性视频h| 久久九九久精品国产免费直播| 久久久www成人免费精品| 免费观看一区| 99国产精品私拍| 午夜日韩福利| 欧美freesex交免费视频| 欧美激情一区二区| 国产伦精品一区二区三区照片91 | 巨乳诱惑日韩免费av| 欧美精品在线一区二区三区| 国产精品一区二区三区四区| 亚洲国产二区| 先锋影音网一区二区| 欧美阿v一级看视频| 一区二区三区欧美| 久久婷婷蜜乳一本欲蜜臀| 亚洲另类春色国产| 久久黄色影院| 欧美性猛交xxxx乱大交蜜桃| 亚洲电影免费| 久久久91精品国产| 一本色道久久88综合亚洲精品ⅰ| 久久人人爽国产| 国产乱码精品一区二区三区av| 亚洲欧洲一区二区三区久久| 久久久久国产精品厨房| 一区二区三区产品免费精品久久75| 久久天堂精品| 一区二区在线视频观看| 欧美伊人精品成人久久综合97| 亚洲精品一区二区三| 蜜桃av噜噜一区| 亚洲电影观看| 欧美va亚洲va香蕉在线| 欧美精品一卡| 久久视频精品在线| 国产视频丨精品|在线观看| 亚洲色在线视频| 亚洲高清毛片| 久久亚洲视频| 亚洲电影网站| 蜜桃久久精品一区二区| 久久在线免费观看| 亚洲高清av在线| 欧美成人情趣视频| 榴莲视频成人在线观看| 亚洲黑丝一区二区| 欧美激情视频一区二区三区免费| 久久国产乱子精品免费女 | 久久久噜噜噜| 久久精品亚洲一区二区| 在线观看一区欧美| 欧美成人小视频| 免费在线观看成人av| 91久久综合亚洲鲁鲁五月天| 欧美激情第三页| 欧美精品一区二| 亚洲一区二区成人| 亚洲欧美一区在线| 一区二区三区在线视频播放| 欧美国产第一页| 欧美日韩影院| 久久久久久久久蜜桃| 久久综合伊人77777麻豆| 亚洲精品在线观看视频| 洋洋av久久久久久久一区| 国产精品久久一卡二卡| 久久久久亚洲综合| 欧美成人一区二区三区在线观看| 一区二区欧美日韩视频| 午夜精品国产更新| 亚洲国产老妈| 亚洲欧美国产制服动漫| 亚洲国产婷婷香蕉久久久久久| 99国产精品久久久久久久成人热| 国产日韩精品久久| 欧美国产极速在线| 国产精品久久久久国产a级| 久久婷婷激情| 欧美性色综合| 欧美黄色aaaa| 国产欧美在线视频| 亚洲精品国产拍免费91在线| 国产欧美在线| 一本一本久久a久久精品综合麻豆| 国产亚洲综合精品| 一本久久综合| 亚洲人妖在线| 久久精品国产99精品国产亚洲性色 | 欧美少妇一区二区| 蜜臀av在线播放一区二区三区| 欧美日韩国产综合一区二区| 久久久一二三| 国产精品每日更新| 亚洲日韩成人| 一区二区三区在线不卡| 亚洲视频www| 一个色综合av| 欧美bbbxxxxx| 欧美国产另类| 狠狠噜噜久久| 亚洲女女女同性video| 这里只有视频精品| 欧美精品国产一区| 亚洲第一区中文99精品| 在线观看日韩一区| 亚洲欧美怡红院| 欧美一区二区三区免费大片| 欧美三级免费| 日韩一级不卡| 亚洲视频在线二区| 欧美日韩在线看| 日韩亚洲欧美成人| 亚洲视频在线看| 欧美午夜电影在线观看| 亚洲毛片在线观看| 亚洲美女淫视频| 欧美1区2区3区| 欧美岛国在线观看| 亚洲精品影院| 欧美成人一区二区三区片免费| 欧美激情一区二区三区全黄 | 国产麻豆91精品| 一区二区三区四区国产| 国产精品99久久久久久久久久久久 | 亚洲午夜极品| 欧美日本不卡高清| 亚洲伦理久久| 亚洲午夜激情网页| 欧美日韩国产va另类| 一区二区av| 欧美亚洲一级| 国产亚洲欧洲997久久综合| 欧美一级专区免费大片| 久久精品欧美| 国产女主播一区二区| 欧美夜福利tv在线| 免费av成人在线| 日韩午夜在线电影| 国产精品海角社区在线观看| 午夜精品福利一区二区蜜股av| 美女性感视频久久久| 亚洲人体偷拍| 国产精品人人爽人人做我的可爱| 亚洲欧美伊人| 亚洲高清123| 亚洲男女自偷自拍图片另类| 国产一区二区三区四区hd| 麻豆国产精品777777在线| 9l视频自拍蝌蚪9l视频成人| 欧美在线视频一区| 免费在线观看成人av| 一区二区动漫| 久久亚洲二区| 一区二区三区视频观看| 国产一区二区av| 欧美大片在线影院| 亚洲欧美一区在线| 亚洲人成网站色ww在线| 久久爱www久久做| 亚洲精品国久久99热| 国产美女诱惑一区二区| 欧美国产日韩精品| 欧美在线播放视频| 一区二区三区久久| 欧美福利精品| 久久激情一区| 亚洲午夜精品一区二区| 亚洲国产高清一区| 国产丝袜一区二区三区| 欧美日韩综合网| 欧美黑人在线观看| 久久性色av| 欧美一区二区三区四区视频| 日韩视频免费在线| 欧美国产三区| 乱码第一页成人| 久久蜜桃资源一区二区老牛 | 国产精品一级在线| 欧美精品一卡二卡| 欧美高清视频在线| 久久久一二三|