比如,服务端发送给客户端的TCP报文段中,确认序号是701,窗口字段(Window Size)是1000,表明服务端能够接受客户端发来的,序号从701开始的1000字节数据。
Checksum(校验和):16位
发送端对TCP首部、数据进行CRC运算得出的结果。接收端收到数据后,对接收到的TCP报文段的首部、数据进行CRC运算,并跟TCP首部中的校验和进行对比,确保数据在传输过程中没有损坏。
计算、校验规则这里先不展开。
Urgent Pointer(紧急指针):16位
仅在URG=1时才生效,它的值是一个偏移量,和序号字段中的值相加得到紧急数据最后一个字节的序号。
options(可选字段):大小不固定
最常见的可选字段是MSS(Maximum Segment Size),表示最长报文大小,通信双方通常在连接的第一个报文段中指明这个选项。(只能出现在SYN报文中)
建立连接 vs 断开连接TCP的两段正式开始传输数据前,需要先建立连接。一旦数据传输完成,则需要断开连接。
后面章节中,会通过实际例子说明TCP数据传输的完整生命流程。在这之前,先简单介绍下TCP是如何建立连接以及断开连接的,也就是我们所熟悉的3次握手以及4次挥手。
这里留几个问题给读者朋友:
建立连接的主要目的是什么?做了哪些事情?
建立连接为什么是3次握手,可不可以是2次?
断开连接一定要4次挥手吗?
Seq => Sequence Number,Ack => Acknowledgment Number,[SYN] => 控制标志SYN,[ACK] => 控制标志ACK
建立连接一般情况下,握手流程如 所示,主要做了两件事情:
互相确认对方当前可以建立连接
互相交换确认初始序列号(ISN)
断开连接一般情况下,TCP断开连接需要4次挥手。假设 TCP A 主动断开连接,流程如下。主要就是告知对方,自己准备断开连接了,并且等待对方的确认。
从实例看TCP生命周期在这一小节,会通过例子,阐述TCP从建立连接,到数据传输,到最后断开连接的整个过程,并通过wireshark抓包探究一些通信的细节。
首先,打开wireshark监听网络请求。然后,在终端输入如下命令发送HTTP请求。