TCP理解

建立一个 TCP 连接的本质:

TCP 是双向的,双向都能传输数据。要保证双向都能可靠传输数据就需要两边都维护传输数据的序列号,这个序列号是所传输的每个子节点的编号,是一个 32 位无符号数,到达最大值再循环从 0 开始。三次握手(建立 TCP 连接)是为了交换双方的所要传输数据的初始序列号。

在三次握手中,两边各自会发一次 SYN,这次 SYN 带上了各自的初始序列号。两边在接收到对方的 SYN 以后,又回传 ACK,这个 ACK 传的是对方初始序列号加1,代表的意义是「我希望接收的下一个字节是从初始序列号的下一个字节开始的」。

SYN 负责传递自己的想要传输字节流的初始序列号,ACK 负责告知对方「我已经接收到你的想传字节流的初始序列号了,以后我们就可以根据这个序列号继续可靠传数据啦」。

关闭一个 TCP 连接的本质:

所谓关闭就是接受数据的一方告诉另一方「我想关闭连接,不要再传数据给我了」,发起关闭的一方称为客户端,客户端告诉服务端自己当前已经接收到的序列号,然后服务端接受到 FIN ,并返回一个值为请求序列号加一的 ACK,表明「好的,我已经收到你关闭请求,传输的数据到此为止」服务端也会向上层应用反馈连接已经关闭。

怎么理解 TCP 是面向流的:

一次 TCP 数据交互是以 IP 数据包为单位的,TCP 数据包被塞进 IP 数据包内进行传输。那么为什么说 TCP 是面向流的,而不是面向分组的 ?当系统往 TCP 请求传输一段字节时,TCP 会把这些字段拆成多个 IP 数据包,当然也可能是一个。如果传输方分三次传输 20 30 50 字节数据,那么接受方不一定以这个数量和次序接受到数据的,很可能是以一个 TCP 定的最好数据大小,依次(可能是平均)接收到数据。

讲 TCP 讲得不错:

http://jm.taobao.org/2017/06/08/20170608/

http://jm.taobao.org/2017/05/25/525-1/