![如果 2 个会话层生成相同的源端口怎么办?](https://linux22.com/image/1572858/%E5%A6%82%E6%9E%9C%202%20%E4%B8%AA%E4%BC%9A%E8%AF%9D%E5%B1%82%E7%94%9F%E6%88%90%E7%9B%B8%E5%90%8C%E7%9A%84%E6%BA%90%E7%AB%AF%E5%8F%A3%E6%80%8E%E4%B9%88%E5%8A%9E%EF%BC%9F.png)
应用程序的会话层功能是否可能生成另一个应用程序已用于当前 TCP 连接的源端口?如何保持这些端口的唯一性?我能想到的唯一方法是,如果 Windows 有一个中央会话层,该会话层适用于所有可以调用其功能的应用程序,或者至少有一个中央源端口管理,情况是否如此?
答案1
TCP 的工作方式运输层;不是会话层。
TCP 确实由操作系统处理。单个应用程序(无论它们是否具有会话层)不会直接制作自己的 TCP 数据包。应用程序只向操作系统发出请求以打开 TCP 套接字,将其连接到远程地址:端口,并通过它发送/接收数据。如今,这几乎普遍使用BSD 套接字 API或者类似的东西。
默认情况下,当地的TCP 套接字的端口由操作系统随机分配。应用程序可能要求特定本地端口(也称为“绑定”),但如果该请求会使套接字不唯一,则操作系统可能会拒绝该请求。这同样适用于“客户端”和“服务器”应用程序。
这偏僻的端口不需要是唯一的(因此您可以同时拥有多个 HTTP 客户端)——只有 {localaddr、localport、remoteaddr、remoteport} 元组必须是唯一的。
(但请注意,即使 TCP 连接由 4 元组标识,操作系统实际上可能有更严格的规则,并且如果本地端口已被使用,则拒绝绑定请求任何连接,即使该连接的其他参数不同。)
附注:有是实际上有一个功能,叫做“原始套接字“并且仅限于特权应用程序,这允许它们生成具有任何协议 ID 和任何他们喜欢的标头的 IP 数据包。
那么,如果应用程序尝试通过原始套接字生成自己的 TCP 数据包,会发生什么情况?操作系统不会阻止数据包的发送。但是,应用程序也无法阻止操作系统对传入的响应做出反应。
例如,应用程序可以发送一个手工制作的 TCP SYN 并接收 SYN/ACK,但操作系统还收到相同的 TCP SYN/ACK,并且由于它属于未知连接,操作系统将发送 TCP RST 终止握手。