Kuz*_*zey 27 networking udp tcp
TCP是面向流的,意味着数据作为连续的字节流传输.但令我困惑的是TCP创建了段并将其传递给IP.IP创建数据包封装段并传输它们.那么这里的连续流究竟在哪里呢?
另一方面,UDP是面向消息的.它从应用层接收消息,创建数据报并将其推送到IP.到目前为止,它与TCP相同,而是创建和推送数据报.是什么让这个协议面向消息?
nos*_*nos 31
向您呈现这些协议的用户(程序员)的接口/ API是:
UDP
面向消息,您有一个API(发送/接收和类似),使您能够发送一个数据报,并接收一个数据报.1 send()调用结果发送1个数据报,1个recv()调用将准确接收1个数据报.
TCP
面向流,您有一个API(发送/接收和类似),使您能够发送或接收字节流.没有保留消息边界,TCP可以将来自许多send()调用的数据捆绑到一个段中,或者它可以将数据从一个send()调用分解为多个段 - 但这对于位于TCP之上的应用程序是透明的,和recv()只是给你回数据,与你收到的数据产生多少send()调用无关.
TCP 是面向流的,因为它能够以连续格式组合数据。例如,您拥有从 1 到 4000 字节的数据。现在它将被划分为 tcp 段,其中每个段都有一个序列号,比如第一个是 1-1200 字节,第二个是 1201 - 2400 等等。
它在通过 ip 数据报发送时可能会被乱序传递,但后来被组装成连续的数据,从而作为一个流出现。序列号有助于重新排序数据包。
稍微深入一点的解释是:
字节流由一大块数据组成,没有段或其他不规则之处。使用数据报(较小的)数据块作为一个整体同时发送和接收。实际上,这意味着对于数据报,每个发送/写入调用发送一个数据包,每个读取/接收调用接收一个数据包,而对于流协议,数据可以以任何方式发送和接收。例如,发送方可以调用 send() 十次,而接收方通过一次 recv 调用接收所有数据。对于数据报,十个发送调用意味着十个数据包和十个接收调用
TCP 是一种面向连接的协议,这意味着它首先建立与接收方的连接,然后以 IP 数据包携带的段(用于传输层的 PDU)发送数据。这种方式称为流,因为它在传输过程中将数据流保持在两端之间。
UDP 是一种无连接传输协议(就像 IP 一样),其数据单元称为数据报。因此,与 tcp 不同,UDP 无需建立连接即可传输数据,只需将数据报消息发送到 IP 层即可传输。