web服务器一般监听80端口,但只是用来建立连接而不会真正拿来通信。真正的数据传输的连接是在socket.accept()步骤之后新开的一个临时通信端口。
我的问题是:
- 监听端口与通信端口的不一致,我上面说的理解是否正确?
- 这个“新开端口”的过程和TCP的三次握手是否有关系,如果没关系的话,哪个在前?
- 具体使用哪一个新端口,服务器是如何通知到客户端的呢?
web服务器一般监听80端口,但只是用来建立连接而不会真正拿来通信。真正的数据传输的连接是在socket.accept()步骤之后新开的一个临时通信端口。
我的问题是:
TCP四元组:源IP、目的IP、源端口、目的端口,这个东西确定一个TCP连接,客户端连接到服务器的时候,会选没被使用的端口作为源端口。
不是新开临时端口,是客户端先选了源端口,然后发起连接进行握手,每个TCP数据包都带有四元组,所以服务器知道客户端用的端口。
需要TCP四元组才能确定一个TCP连接,所以不存在只用80端口或者只用一个新的端口来传输的情况,源端口和目标端口都是必须的,也不会新开端口。
例如看看一个运行中的redis(对http服务器同理的),监听6379端口:
第一个LISTEN状态的就是监听的socket,后面ESTABLISHED的就是和客户端建立的socket,ESTABLISHED的socket还是服务端还是6379端口,而客户端端口不同。