新来这里的人。我正在阅读计算机网络(第三版)的书,在3.2节中,他们正在讨论UDP和TCP的多路复用/解复用。
在UDP协议中,套接字由源IP和源端口唯一标识。
在TCP协议中,套接字由源IP、源端口、目标IP和目标端口唯一标识。为什么TCP协议需要两条额外的信息才能使接收主机正确地解复用段并将其发送到正确的进程?
我认为这是必要的唯一原因是如果客户端总是将TCP段发送到与连接请求段相同的端口。例如,我的浏览器总是将数据发送到服务器的端口80,即使服务器已经在另一个端口上专门为该会话建立了TCP套接字。在这种情况下,TCP必须使用源IP和源端口信息来解复用到正确的套接字。它不能仅仅依赖于源IP信息,因为单个主机可以建立多个会话,但是每个会话必须位于不同的端口上。
UDP没有出现此问题的原因是,目标IP /端口组合标识了将处理请求的进程附加到的套接字,因为在UDP中没有为请求“生成”多个新套接字。
这是正确的,还是我得出了错误的结论?
发布于 2018-10-30 15:59:42
不幸的是,事情变得混乱,因为有两个不同的套接字的定义。TCP使用套接字一词来指地址和端口的组合,但是berkerly套接字及其派生项(现在几乎所有实际使用的IP实现所使用的API )使用套接字一词来指一种操作系统通信对象。
为什么TCP协议需要两条额外的信息才能使接收主机正确地解复用段并将其发送到正确的进程?
这不仅仅是一个正确的过程,而是正确的通信对象。
我认为这是必要的唯一原因是如果客户端总是将TCP段发送到与连接请求段相同的端口。例如,我的浏览器总是将数据发送到端口80。
确实如此。
即使服务器已经在另一个端口上为该会话专门建立了TCP套接字。
这似乎是一个常见的误解,可能是由套接字的不同定义引起的。接受连接会创建一个新的通信对象(该术语的Berkerly套接字中的套接字),但不会在服务器上分配新的ip/端口组合( TCP RFC术语中的套接字)。
UDP没有出现此问题的原因是,目标IP /端口组合标识了将处理请求的进程附加到的套接字,因为在UDP中没有为请求“生成”多个新套接字。
正确(假设您的段落使用berkerly套接字意义上的“套接字”)。
发布于 2018-10-30 10:46:43
在UDP协议中,套接字由源IP和源端口唯一标识。在TCP协议中,套接字由源IP、源端口、目标IP和目标端口唯一标识。为什么TCP协议需要额外的两条信息?
对于TCP术语来说,套接字是地址端口对;一对套接字定义连接。( RFC 793 p5)
恐怕你弄错了UDP,尽管它没有真正的“套接字”--即使伯克利套接字库这样称呼它们,以与TCP基本相同的方式调用地址端口对复用器也是合理的。
一种典型的情况是,从一个主机到同一个DNS服务器同时进行多个DNS解析,显然只有源端口号是不同的。您可以看到,这种情况与从一个客户端到单个web服务器的多个同时TCP连接完全相同。
UDP有无连接的数据报。主机A将数据报从地址端口对中发送出来,该端口对指向B的地址端口对,B通常(但并非总是)以镜像方式应答。就“通信”而言,它的操作与TCP连接完全相同。
您有时会看到对5元组(procotol、源地址、源端口、目标地址、目标端口)的引用,其中UDP协议为17,TCP协议为6。这是大多数防火墙、路由器等用于NAT和类似操作来标识通信对的引用。
即使服务器已经在另一个端口上专门为该会话建立了TCP套接字。
恐怕您也弄错了TCP,可能是因为TCP协议(RFC 793)的定义与其最常见的实际实现伯克利套接字库( Unix中使用的)和它所衍生的一切之间的术语冲突。
如果你把注意力集中在协议上,就会清楚得多:没有“不同端口”。web服务器只监听1.1.1.1端口80。客户端只从2.2.2.2端口56789发送。每个数据包将为1.1.1.1:80至2.2.2.2:56789,反之亦然;通过查看带有tcpdump/wireshark/etc的数据包可以轻松地验证。
(简单地说,TCP连接由一个整数表示,通常称为sockfd,但令人困惑;TCP套接字由一个struct sockaddr表示。accept()系统调用非常混乱地谈到创建一个“新连接套接字”,它指的是处于连接状态的新连接结构。这个结果的元组将在我们的示例中(1.1.1.1、80、2.2.2.2、56789)。关于UDP,这个库允许您将UDP看作是连接的,这是描述两个进程之间UDP数据报交换的一种方便但完全错误的方法,它只意味着结构记住远地址-端口对,这在编程术语中使UDP“连接”看起来就像TCP“连接”。请记住,伯克利库不仅适用于IP,而且还概括了几个不同的底层网络系统。如果您想跟进这些网络编程术语,我建议Stack溢出,它有许多非常有能力的网络程序员。)
发布于 2019-04-13 20:50:21
如果你正在读的书是吉姆·黑罗斯的“计算机网络-自上而下的方法”,你和我读的是同一本书。-) FYI,这本书实际上说明了标识UDP套接字的两个元组是基于目标(而不是源) IP和端口。至少,第七版是这么说的。
要回答您的问题,TCP是面向连接的,而UDP是无连接的.因此,当在主机和服务器之间建立TCP请求时,该连接的每一方都希望确定随后的请求将使用相同的连接(否则,使用类似于TCP的面向连接的协议有什么意义?)而且,由于两个具有相同目标IP和端口但不同源IP和端口的数据段将在服务器端使用两个不同的套接字,因此确保后续请求与原始请求使用相同套接字的唯一方法是在将数据段与其正确的套接字匹配时同时使用源和目标IP/端口。
相比之下,UDP并不是面向连接的.您不必担心使用与以前的请求相同的套接字,并且在标识要将段路由到哪个UDP套接字时,不需要包括源IP/端口。因此,两个元组就足够了。
https://networkengineering.stackexchange.com/questions/54344
复制相似问题