据我所知,TCP需要四个值来在客户端进行TCP多路复用并在服务器端进行多路分解:
端口号是TCP标头的一部分,但IP地址不是TCP标头的一部分,它们属于IP标头。
问题:
每个主机端的TCP实现如何获知必要的IP地址?
创建TCP套接字Socket mySocket = new Socket(remoteIPNr,remotePortNr)
时,指定远程IP地址。但这发生在应用程序层上。那么套接字如何将远程IP地址传输到传输层?此外,TCP如何获知有关源IP地址的信息?
答案 0 :(得分:1)
套接字如何将远程IP地址传输到传输层?
它以与任何系统调用参数进入内核相同的方式到达传输层。这就是系统调用参数的用途。这里没有什么神秘之处,因为它是一个IP地址。例如,这同样适用于目标端口号。
如果您正在询问TCP如何查看IP标头,那么您错误地认为它不能。它可以。
此外,TCP如何获知有关源IP地址的信息?
源IP地址由应用程序在bind()
调用中定义,或者在您发出connect():
时默认由TCP提供。查询IP路由表以确定哪个本地IP地址是到目标地址最便宜的路由,该地址成为套接字的源地址。
对于您没有询问的下一个问题,关于源端口,应用程序在bind()
调用中指定了源端口,否则系统会找到一个空闲端口号并将其用作源端口。