其实,这里的 TCP 流,就是英文的 TCP Stream。
Stream 这个词有“流”的意思,也有“连续的事件”这样一个含义,所以它是有前后、有顺序的,这也正对应了 TCP 的特性。
跟 Stream 相对的一个词是 Datagram,它是指没有前后关系的数据单元,比如 UDP 和 IP 都属于 Datagram。在 Linux 网络编程里面,TCP 对应的 socket 类型是 SOCK_STREAM,而 UDP 对应的,就是 SOCK_DGRAM 了。
显然,DGRAM 就是 Datagram 的简写。
在具体的网络报文层面,一个 TCP 流,对应的就是一个五元组:传输协议类型、源 IP、源 端口、目的 IP、目的端口。比如,今天你访问了xxxx网站,那么你这次的 TCP 流就可 能就是这样一个五元组:
```shell
(TCP, your_ip, your_port, geekbang_ip, 443)
```
一个 IP 报文,包含了所有这五个元素,所以 Wireshark 在解析抓包文件时,自然就能通过五元组知道每个报文所属的 TCP 流了。
这也是为什么我们可以在 Wireshark 里,用Follow TCP Stream 的方法,找到报文所在的 TCP 流。不过有时候,也会有四元组的说法。其实它跟五元组大体上是一致的,只是四元组没有区分传输层协议类型(TCP 或者 UDP)。但是如果我们都清楚地知道应用类型,比如知道应用是 HTTP 协议的,那它的传输层协议默认就是 TCP,这一元是否算在里面,已经不重要了。