免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3530 | 回复: 13
打印 上一主题 下一主题

tcp 协议高端问题?你认为不高端,回复BS我吧,不胜感激。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-05 16:40 |只看该作者 |倒序浏览
关于tcp协议socket 通信问题。

最近,在访问量较大的服务器上,使用netstat -atnp 查看到,同一个socket 同一时刻有多个TIME_WAIT 的状态,请问有高手能帮我解释下这是为什么吗?
我的理解:按道理来说,系统不应该存在相同的Socket。一个Socket也不应该出现两个不一样的状态,同时,同一个Socket 不应该同时出现多个相同的状态。
如果出现两个相同的SOCKET,那数据传输不就出问题了吗?
附: 该服务器确定关闭了tcp 套接字重用机制。

同一个套接字TIME_WAIT重复状态如下:
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -  

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
2 [报告]
发表于 2012-03-05 18:05 |只看该作者
耶。

正常啊。

缩短timewait时间会改善,但不能根除。也不能缩成0 。

论坛徽章:
0
3 [报告]
发表于 2012-03-06 15:22 |只看该作者
劳驾解释下正常的理由么?

论坛徽章:
0
4 [报告]
发表于 2012-03-07 11:09 |只看该作者
期待斑竹回复。

你说的正常,是说存在TIME_WAIT 的状态是正常,还是说“同一个socket 同一时刻 有多个TIME_WAIT的状态”是正常的?

如果是正常的,你能解释清楚,同一个socket 的多个TIME_WAIT 的是如何同时产生的,同样的socket ,是如何进行数据传输的,又如何正常关闭的?

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
5 [报告]
发表于 2012-03-07 16:50 |只看该作者
都正常。

你自己先试图解释一下你服务器只开了一个80端口,为什么大家可以同时访问呢??? 然后推翻你先前的认识。就可以了。

有疑问参考TCP/IP协议详解,卷1  ,扩展参考卷3 。

论坛徽章:
0
6 [报告]
发表于 2012-03-08 10:45 |只看该作者
回复 5# ssffzz1
多谢回复!
我解释下你提的问题,不对的地方,还请指正,谢谢。

Q:服务器只开了一个80端口,为什么大家可以同时访问呢???
A:应用程序使用TCP协议, 三次握手建立连接,建立的socket 是流套接字(基于TCP协议),使用Internet域。
先说明应用程序上的操作:
服务器端:服务器应用程序开放80端口,并处于LISTEN状态的过程:服务器应用程序(nginx,apache等)调用socket函数创建socket,使用bind函数bind绑定地址和套接字名(即包含IP地址和端口号的Internet套接字),使用listen函数创建服务器端socket队列,使用accept函数等待客户端的请求。
客户端:客户端应用程序(浏览器)调用socket函数创建客户端套接字,接下来调用connect 函数发送请求到服务器端,服务器端的accept 函数接受客户端请求,建立连接。
只开一个80端口,为什么大家都可以同时访问呢?原因在:accept函数接受到A客户端请求后,使用原来的套接字(即服务器端socket函数创建的套接字)相同的属性打开新的套接字文件句柄,并将它附加给A客户端的套接字(即由监听套接字产生连接套接字),这个连接套接字可以与A客户端进行通信,此时TCP连接建立。原来的套接字(即服务器端socket函数创建的套接字)已经解放出来了,如果有新的客户端B请求80端口服务,原来的套接字又可以进行处理了。

关于TCP的三次握手过程,我的理解如下:

客户端发送tcp报文,包含了源端口,目的端口,flag位为S 即 SYN 包给服务器端
服务器收到后,发送 ACK+SYN 包到客户端
客户端收到后,发送 ACK 包 给服务器端,从而建立三次握手。
例如:我的问题实例:
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               

客户端IP:124.65.82.194 发起请求,本地创建socket,包含:源ip:124.65.82.194 源端口:2922
目标IP:58.248.171.* ,目标端口80
服务器端IP:58.248.171.* ,接受到客户端请求后,建立三次握手。此时服务器端套接字状态为“ESTABLISHED”
当服务器和客户端之间数据传输完毕后,接下来关闭TCP连接。

TCP 关闭连接:(这里只说明TCP三向关闭)
A主动发送FIN包,A进入FIN_WAIT_1 状态
B接受到A的FIN包,状态转为CLOSE_WAIT,再完成发送FIN+ACK包,状态变为LAST_ACK
A收到B的FIN+ACK包,状态变为TIME_WAIT,并发送ACK,等待2MSL后,TIME_WAIT消失
B收到A的ACK后,状态LAST_ACK 消失。

主动发送FIN包的一方,在收到对方发回的ACK包后进入TIME_WAIT状态
从本例看,是服务器:58.248.171.* 主动发送的FIN包。



我的问题依旧:
同一个socket 的多个TIME_WAIT 的是如何同时产生的,同样的socket ,是如何进行数据传输的,又如何正常关闭的?

分析:
假设1、同一socket的多个TIME_WAIT连接是由多个处于ESTABLISHED 状态的socket 关闭产生。       
        如果假设1成立,这将得出矛盾,即同一个socket ,多个ESTABLISHED 状态,数据传输肯定会出问题,TCP协议中也没有提及到这个可能出现的情况。
假设2,同一socket的多个TIME_WAIT连接是由同一个处于ESTABLISHED 状态的socket 关闭产生。
        似乎这个假设更像问题的本质,如果是这样,那么在服务器端主动发出FIN包,并收到客户端的ACK包,进入TIME_WAIT状态的时候出现了什么问题?
        你说的正常,请问是在哪一步出现的正常现象?还请指出,我要推翻的认识在哪?
       

   

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
7 [报告]
发表于 2012-03-08 13:57 |只看该作者
这将得出矛盾,即同一个socket ,多个ESTABLISHED 状态,数据传输肯定会出问题,TCP协议中也没有提及到这个可能出现的情况。


你已经自相矛盾了。
多个ESTABLISHED 状态,数据传输肯定会出问题。如果真的会出问题的话,你多个客户端如何访问服务器呢?accept函数收到客户端请求后  打开新的套接字文件句柄  。这个套接字不还是80端口吗?????

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
8 [报告]
发表于 2012-03-08 13:59 |只看该作者
知道如何写程序,却不知道程序如何工作。

论坛徽章:
0
9 [报告]
发表于 2012-03-08 15:11 |只看该作者
本帖最后由 liuyadan720 于 2012-03-08 15:36 编辑

你还没看明白问题
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -               
tcp        0      0 58.248.171.*:80         124.65.82.194:2922      TIME_WAIT   -  

兄弟上面的套接字,都是一样的,你发现了没有。
也就是说,服务器端 80  和 客户端 端口:2922 有多个连接。
加入80端口 和 A 客户端 2922 已经建立连接,在这个套接字没有正常关闭释放的时候,这个连接套接字是不能分给其他应用程序的。
而这里出现的,貌似是分配了多次。

现在的问题:同样的一个连接套接字(包括服务器ip,端口,客户端ip,端口) 出现了多次,

你说80 端口 和多个客户端建立 ESTABLISHED 状态 ,出现的连接套接字是不一样的
比如客户端A访问服务器B 80端口服务
B服务器上显示的套接字如下:
B:80 --- A:24564
同时客户端C访问服务器B 80端口服务
B服务器上显示的套接字如下:
B:80 --- C:24564

现在的问题是:
B:80  ---  A: 24564
B:80  ---  A: 24564
B:80  ---  A: 24564
B:80  ---  A: 24564
B:80  ---  A: 24564
B:80  ---  A: 24564
B:80  ---  A: 24564
B:80  ---  A: 24564
B:80  ---  A: 24564

正常吗?请你解释

补充一点:你先搞清楚,什么是同样的连接socket 这个问题。

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
10 [报告]
发表于 2012-03-08 17:22 |只看该作者
哦,这样啊。

貌似攻击。

你收到一个124.65.82.194:2922 发过来的syn报文,然后建立连接,然后客户端断开,服务器进入TIME_WAIT。在TIME_WAIT没有超时之前再次重复上述过程即可。

你抓个包上来看下吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP