服务器与客户端建立socket时,一般会新开一个端口而不是占用80,这个过程和“三次握手”之间是什么关系?

web服务器一般监听80端口,但只是用来建立连接而不会真正拿来通信。真正的数据传输的连接是在socket.accept()步骤之后新开的一个临时通信端口。
我的问题是:

  1. 监听端口与通信端口的不一致,我上面说的理解是否正确?
  2. 这个“新开端口”的过程和TCP的三次握手是否有关系,如果没关系的话,哪个在前?
  3. 具体使用哪一个新端口,服务器是如何通知到客户端的呢?
阅读 6.5k
1 个回答

TCP四元组:源IP、目的IP、源端口、目的端口,这个东西确定一个TCP连接,客户端连接到服务器的时候,会选没被使用的端口作为源端口。

真正的数据传输的连接是在socket.accept()步骤之后新开的一个临时通信端口。

不是新开临时端口,是客户端先选了源端口,然后发起连接进行握手,每个TCP数据包都带有四元组,所以服务器知道客户端用的端口。

服务器端真正与客户端进行数据传输时使用的一般不是80端口

需要TCP四元组才能确定一个TCP连接,所以不存在只用80端口或者只用一个新的端口来传输的情况,源端口和目标端口都是必须的,也不会新开端口。

例如看看一个运行中的redis(对http服务器同理的),监听6379端口:

clipboard.png

第一个LISTEN状态的就是监听的socket,后面ESTABLISHED的就是和客户端建立的socket,ESTABLISHED的socket还是服务端还是6379端口,而客户端端口不同。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏