亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

connect超時(shí)時(shí)間的一點(diǎn)探討

系統(tǒng) 1746 0
對阻塞的connect到底會(huì)多久超時(shí)(返回-1,并且errno被設(shè)為ETIMEDOUT)一直也沒有搞清楚,今天花時(shí)間
看了一下代碼并作了一點(diǎn)實(shí)驗(yàn),大致得出了一點(diǎn)結(jié)論。沒有時(shí)間寫的太細(xì)了,把結(jié)果貼出來,感興趣的人自己去看吧。
背景知識(shí):
各種系統(tǒng)對此都沒有一個(gè)總時(shí)間的限制,而是設(shè)置了重連的次數(shù)(即如果收不到synack,會(huì)重試多少遍),這個(gè)缺
省值個(gè)個(gè)系統(tǒng)不大一樣(linux不同版本這個(gè)值也有過變化,見后)。每次重連之間的間隔時(shí)間會(huì)通過算法來調(diào)整,
這個(gè)算法個(gè)個(gè)系統(tǒng)的實(shí)現(xiàn)也有差別,因此造成了系統(tǒng)之間connect超時(shí)時(shí)間的千差萬別(早期的BSd系統(tǒng)會(huì)共耗時(shí)75秒
,這點(diǎn)《UNP》 section4.3中提到了,但現(xiàn)代的系統(tǒng)一般更久)。
大多數(shù)系統(tǒng)這個(gè)重連數(shù)可調(diào)節(jié)(linux可以通過/proc/sys/net/ipv4/tcp_syn_retries或sysctl來修改此值。
TCP/IP V1》的附錄E提到了其他系統(tǒng)的)
底下簡單分析了linux下的相關(guān)代碼,并作了個(gè)小實(shí)驗(yàn)。為了讓timeout能夠超時(shí),我設(shè)了防火墻(通過ipchains)
,將規(guī)則設(shè)為DENY(REJECT會(huì)返回icmp端口不可達(dá),會(huì)造成connect函數(shù)馬上返回),并通過tcpdump檢查發(fā)包重試
的情況。
自己寫程序時(shí)應(yīng)該考慮這種情況,自行設(shè)置更短超時(shí)(《UNP》中說的很清楚了)。
nmap再掃描這類沒有任何返回的端口時(shí),會(huì)將其狀態(tài)標(biāo)為"filter",這時(shí)大多情況就是有防火墻了(如果帶寬足夠,
對方系統(tǒng)又沒有"非常忙"的情況下)。
更細(xì)致的探討請見rfc793,rfc1122,《TCP/IP V1》和論文《Congestion Avoidance
and Control》。
還有一個(gè)疑問,為什么alan
cox在兩次郵件中一次說總超時(shí)大約是15分鐘,一次又說是30分鐘?是不是以前這個(gè)重試
次數(shù)設(shè)的更大?沒時(shí)間考古了,知道的請回我的mail:yawl@docshow.net.相關(guān)連接如下:
http://www.wcug.wwu.edu/lists/netdev/199808/msg00032.html
http://www.uwsg.indiana.edu/hypermail/linux/kernel/9802.0/0384.html
linux相關(guān)的代碼(結(jié)合后面的結(jié)論看):
tcp_v4_init_sock():
tp->rto = TCP_TIMEOUT_INIT; //初值,即3秒
tcp_retransmit_timer():
tp->retransmits++;
tp->rto = min(tp->rto <<1, TCP_RTO_MAX);
//如果小于兩分鐘(TCP_RTO_MAX),每次乘2
tcp_reset_xmit_timer(sk, TCP_TIME_RETRANS, tp->rto);
tcp_connect():
tp->rto = TCP_TIMEOUT_INIT; //重復(fù)語句???
tp->retransmits = 0;
tcp_clear_retrans(tp);
運(yùn)行結(jié)果:
[yawl@redhat-6 tmp]$ gcc -o connect connect.c
[yawl@redhat-6 tmp]$ ./connect 192.168.10.1 50001
Fri Apr 20 12:37:36 2001
connect fail: Connection timed out
Fri Apr 20 12:50:45 2001
運(yùn)行環(huán)境如下:
[yawl@redhat-6 tmp]$ uname -a
Linux redhat-6 2.2.12-20 #1 Mon Sep 27 10:40:35 EDT 1999 i686
unknown
[yawl@redhat-6 tmp]$ cat /proc/sys/net/ipv4/tcp_syn_retries
10
[root@redhat-6 yawl]# ipchains -A input --proto tcp
--destination-port 50001 -j DENY
[root@redhat-6 yawl]# ipchains -L
Chain input (policy ACCEPT):
target prot opt source destination ports
DENY tcp ------ anywhere anywhere any -> 50001
Chain forward (policy ACCEPT):
Chain output (policy ACCEPT):
[root@redhat-6 yawl]# tcpdump port 50001
Kernel filter, protocol ALL, datagram packet
socket
tcpdump: listening on all devices
12:37:36.926670 lo > redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:37:36.926670 lo <redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:37:39.924937 lo > redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:37:39.924937 lo <redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:37:45.924934 lo > redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:37:45.924934 lo <redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:37:57.924934 lo > redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:37:57.924934 lo <redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:38:21.924940 lo > redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:38:21.924940 lo <redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:39:09.924941 lo > redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:39:09.924941 lo <redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:40:45.924939 lo > redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:40:45.924939 lo <redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:42:45.924938 lo > redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:42:45.924938 lo <redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:44:45.924940 lo > redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:44:45.924940 lo <redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:46:45.924941 lo > redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:46:45.924941 lo <redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:48:45.924939 lo > redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:48:45.924939 lo <redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:50:45.924942 lo > redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
12:50:45.924942 lo <redhat-6.1.nsfocus.com.3389 >
redhat-6.1.nsfocus.com.50001: S 2996115497:2996115497(0) win 31072 <mss
3884> (DF)
結(jié)論(請對照前面的代碼):
0s 12:37:36.926670 //第一次發(fā)起連接
+3s 12:37:39.924937 //未收到回應(yīng),開始重試
+6s 12:37:45.924934 //在未超過TCP_RTO_MAX之前,每次重試時(shí)間翻倍
+12s 12:37:57.924934
+24s 12:38:21.924940
+48s 12:39:09.924941
+96s 12:40:45.924939
+120S 12:42:45.924938
//超過TCP_RTO_MAX之后,不再翻倍,而是固定用TCP_RTO_MAX,即2分鐘
+120s 12:44:45.924940
+120S 12:46:45.924941
+120s 12:48:45.924939
+120s 12:50:45.924942
共用了大約13分鐘零9秒,重試了11次(比設(shè)置的值多了一次,在maillist中發(fā)現(xiàn)有人提到了這個(gè)bug,并在新版本
中作了修正,見鏈接 http://www.uwsg.indiana.edu/hypermail/linux/kernel/0001.0/0237.html
重連次數(shù)linux不同版本也有變化:
在2.2.16的內(nèi)核代碼中(include/net/tcp.h):
#define TCP_SYN_RETRIES 10 /* number of times to retry opening a
* connection (TCP_RETR2-....) */
而在2.4.1中(include/net/tcp.h):
#define TCP_SYN_RETRIES 5 /* number of times to retry active opening a
* connection: ~180sec is RFC minumum */
我改了一下這個(gè)次數(shù):
[root@redhat-6 yawl]# echo "5" >
/proc/sys/net/ipv4/tcp_syn_retries
[root@redhat-6 yawl]# cat /proc/sys/net/ipv4/tcp_syn_retries
5
然后又測了一遍,結(jié)論類似,用時(shí)3分9秒。
其他系統(tǒng)的測試我沒有時(shí)間做了,如果有有感興趣的測過了請把結(jié)果給我發(fā)一份 yawl@docshow.net .
測試程序:
[yawl@redhat-6 tmp]$ cat connect.c
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>
#include <time.h>
int main(int argc, char* argv[])
{
int fd;
struct sockaddr_in sa;
time_t cur;
if(argc!=3){
printf("%s IP PORTn",argv[0]);
exit(-1);
}
fd=socket(AF_INET, SOCK_STREAM, 0);
if(fd<0){
perror("socket fail");
exit(-1);
}
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=inet_addr(argv[1]);
sa.sin_port=htons(atoi(argv[2]));
cur=time(NULL);
printf("%s", ctime(&cur));
if(connect(fd, (struct sockaddr*)&sa, sizeof(sa)) <0){
perror("connect fail");
}
cur=time(NULL);
printf("%s", ctime(&cur));
close(fd);
exit(0);
}

connect超時(shí)時(shí)間的一點(diǎn)探討


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日韩中文欧美 | 国语精品91自产拍在线观看二区 | 国产福利第一视频 | 国产色网 | 日韩欧美在线观看 | 欧美一区二区在线免费观看 | 日韩精品亚洲一级在线观看 | 国产亚洲精aa在线观看香蕉 | 2021久久伊人精品中文字幕有 | 日本亚洲一区二区三区 | 欧美真人视频一级毛片 | 亚洲欧美精品国产一区色综合 | 亚洲天堂国产精品 | 国产精品青草久久 | 国产高清一区二区三区免费视频 | 成人国产在线视频在线观看 | 国产精品九九久久一区hh | 精品欧美高清一区二区免费 | 爱爱精品视频 | 特黄女一级毛片 | 破处一级片 | 日韩精品你懂的在线播放 | 亚洲欧美精品天堂久久综合一区 | 一级片成人 | 99热这里只有精品1 99热这里只有精品18 | 四虎影视色费永久在线观看 | 国产特黄一级一片免费 | 一道本免费视频 | 久久国产精品偷 | 最新日本免费一区二区三区中文 | 久久成人在线 | 久久久久青草线蕉亚洲麻豆 | 四虎网址大全 | 国产只有精品 | 毛片免费观看成人 | 欧美最猛性xxxxx短视频 | xx欧美老妇 | 成人在线一区二区三区 | 欧美综合图片区 | 亚洲精品久中文字幕 | 国产精品福利一区二区久久 |