知方号

知方号

网络:什么叫做TCP流

网络:什么叫做TCP流

为什么叫做TCP流

在一些技术文档中,特别是wireshark相关的文档中,“TCP流"是一个很常见的词汇。它是什么意思呢?为什么叫做”流“呢?

其实,这里的TCP流,就是TCP Stream。Stream这个词有”流“的意思,也有”连续的事件“这一含义,所以它是有前后、有顺序的,这也正对应了TCP的特点。TCP是一种流协议(stream protocal)。这就意味着数据是以字节流的形式传递给接受者的,没有固定的“报文”或“报文边界”的概念。因此,读取TCP数据时我们无法预知在一次指定的读操作中会返回多少字节。 跟Stream相对的一个词是Datagram,它是指没有前后关系的数据单元,比如UDP和IP都属于Datagram。在 Linux 网络编程里面,TCP 对应的 socket 类型是SOCK_STREAM,而 UDP 对应的,就是 SOCK_DGRAM 了。显然,DGRAM 就是Datagram 的简写。

在具体的网络报文层面,一个TCP流,对应的就是一个五元组:传输协议类型、源IP、源端口、目的IP、目的端口。

(TCP, your_ip, your_port, target_ip, target_port)

一个IP报文,包含了所有的这五个元素,所以wireshark在解析抓包文件时,自然就能够通过五元组知道每个报文所属的TCP流了。这也是为什么我们可以在 Wireshark 里,用Follow TCP Stream 的方法,找到报文所在的 TCP 流。

不过有时候,也会有四元组的说法,其实它跟五元组大体上是一致的,只是四元组没有区分传输层协议类型型(TCP 或者 UDP)。但是如果我们都清楚地知道应用类型,比如知道应用是 HTTP 协议的,那它的传输层协议默认就是 TCP,这一元是否算在里面,已经不重要了。

如何理解“有前后、有顺序”

TCP发送完数据之后,在接收端:

顺序肯定是会保持的,即数据是以什么顺序发的,就会以什么顺序接收,这个是由 TCP 严格保证的;如果发送过程中有 TCP 分组丢失,但是其后续分组陆续到达,那么 TCP 协议栈会缓存后续分组,直到前面丢失的分组到达,最终,形成可以被应用程序读取的数据流。 TCP是一种流,这会带来什么后果?

上面我们说到,在任意指定时刻,可读的数据量都是不确定的。

TCP是一个流协议,尽管数据是以IP分组的形式传输的,但分组中的数据量与send调用中传送给TCP多少数据并没有直接关系。而且,接收程序也没有什么可靠的方法可以判断数据时如何分组的。TCP会记录它发送了多少字节,以及确认的字节,但它不会记录这些字节是如何分组的。

这就可能导致粘包问题

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。