网络:什么叫做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会记录它发送了多少字节,以及确认的字节,但它不会记录这些字节是如何分组的。

这就可能导致粘包问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值