TCP首部格式
源端口号、目的端口号:用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接,在网络编程中,一般一个IP地址和一个端口号组合称为一个套接字(socket)。
序号:用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。在tcp中tcp用序号对每个字节进行计数
确认序号:包含发送确认的一端所期望收到的下一个序号。确认序号=序号+数据字节数+ 1
首部长度:用于记录tcp数据报首部的长度,一般为20字节,实际值为首部长度除以4。
URG: 紧急指针( urgent pointer)有效。
ACK: 确认序号有效。
PSH: 接收方应该尽快将这个报文段交给应用层。
RST: 重建连接。
SYN: 同步序号用来发起一个连接。
FIN: 发端完成发送任务。
窗口大小:用于流量控制。
检验和:检验和覆盖了整个的 TCP报文段: TCP首部和TCP数据,与udp相似需要计算伪首部。
Wireshark抓包分析TCP结构
利用wireshark抓取一个tcp数据包,查看其具体数据结构和实际的数据:
Wireshark抓包分析TCP3次握手
下面通过利用http应用层连接一个网络,实现tcp的3次握手和简单的数据交换过程,下面通过抓包来实际观察这个过程。
从第一行的tcp往下看,前面3个tcp包为3次握手的过程,接着http包说明成功建立连接,主机向服务器发送一个http应用请求,服务器收到请求后,返回一个tcp确认帧,接着发送一个http应答给主机,主机收到服务器的http应答数据后,又发送一个tcp确认帧,确认收到了数据。这样图中的前7个包实现了主机和服务器建立连接,并实现一次简单的数据请求应答过程。即下图所示的交互按键回显过程:
接下来是按照顺序的7个数据帧的数据结构。数据帧顺序分别为:
1. 主机发起一个tcp连接请求(tcp),
2. 服务器响应连接请求(tcp),
3. 主机返回ACK完成3次握手成功建立连接(tcp),
4. 主机发送一个http网页请求(http),
5. 服务器收到请求返回一个ACK帧(tcp),
6. 服务器根据请求发送数据到主机(http),
7. 主机收到服务器数据返回一个ACK帧(tcp),具体帧细节见下图:
下面通过wireshark抓包了解具体的释放连接过程,通过断开一个连接,抓取到4个TCP帧,帧顺序依次为:
1. 主动关闭放发送一个FIN帧给被动方
2. 被动方收到关闭信息返回一个确认ACK帧
3. 被动方发送一个FIN帧给主动方
4. 主动方收到被动方的FIN关闭信息返回一个ACK帧,连接释放
下面为按照顺序的帧数据结构详细信息:
TCP的最大报文段长度
最大报文段长度(MSS)表示TCP传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的MSS。一般来说,MSS越大越好,因为报文段越大允许每个报文段传送的数据就越多,相对IP和TCP首部有更高的网络利用率。
MSS选项只能出现在SYN报文段中,所以只能在SYN=1的帧中才会有MSS选项说明报文的最大段长度。