- 论坛徽章:
- 0
|
回复 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状态的时候出现了什么问题?
你说的正常,请问是在哪一步出现的正常现象?还请指出,我要推翻的认识在哪?
|
|