TCP协议原理详解

描述

1. TCP报文封装

一个典型的使用TCP协议封装的数据包,包括以太网MAC头+网络层IP数据头+传输层TCP头+要传输的数据。 详见下图所示:

TCP协议

2. TCP报文结构

TCP(Transmission Control Protocol,传输控制协议)提供的是面向连接,可靠的字节流服务。 即客户和服务器交换数据前,必须现在双方之间建立一个TCP连接,之后才能传输数据。 并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

TCP报文结构如下图示:

TCP协议

TCP报文结构各字段功能如下示:

源端口号:表示发送端端口号,字段长16bit

目标端口:表示接收端端口号,字段长16bit

序号:字段长32bit,是指发送数据的位置。 每发送一次数据,就累加一次该数据字节数的大小

确认序号:字段长32bit,是指下一次应该收到的数据的序列号。 实际上,它是指已收到确认应答号减一为止的数据。 发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收

首部长度:字段长4bit,它指出了 TCP 报文段首部长度,以字节为单位,最大能记录15*4=60字节的首部长度

保留:字段长6bit,主要是为了以后扩展时使用。 一般设置为0

标志字段:字段长6bit,这些控制标志也叫做控制位

  • URG:表示本报文段中发送的数据是否包含紧急数据。 URG=1,表示有紧急数据。 后面的紧急指针字段只有当URG=1时才有效
  • ACK:表示是否前面的确认号字段是否有效。 ACK=1,表示有效。 只有当ACK=1时,前面的确认号字段才有效。 TCP规定,连接建立后,ACK必须为1
  • PSH:告诉对方收到该报文段后是否应该立即把数据推送给上层。 如果为1,则表示对方应当立即把数据提交给上层,而不是缓存起来
  • RST:只有当RST=1时才有用。 如果你收到一个RST=1的报文,说明你与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。 或者说明你上次发送给主机的数据有问题,主机拒绝响应
  • SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1
  • FIN:标记数据是否发送完毕。如果FIN=1,就相当于告诉对方:“我的数据已经发送完毕,你可以释放连接了”

窗口大小:字段长16bit,TCP的流量控制由连接的每一端通过声明的窗口大小来提供,窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的数据序号,发送方根据窗口大小调整发送数据,以实现流量控制。 窗口最大为 65535 字节,当接收方告诉发送方一个大小为 0 的窗口时,将完全阻止发送方的数据发送

校验和:检验和覆盖了整个的 TCP 报文段(TCP 首部和 TCP 数据区域),由发送端计算和填写,并由接收端进行验证

紧急字段:只有当URG标志置1时紧急指针才有效,紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。 简单来说,本TCP报文段的紧急数据在报文段数据区域中,从序号字段开始,偏移紧急指针的值结束

选项字段:选项字段用于提高TCP的传输性能。 其最大长度可根据TCP首部长度进行推算。 TCP首部长度用4位表示,那么选项部分最长为:(2^4-1)*4-20=40字节

TCP协议

  • kind=2,最大报文段长度(MSS)选项:MSS选项用于在建立连接时决定最大段长度的情况,该选项用于大部分操作系统。TCP连接初始化时,通信双方使用该选项来协商最大报文段长度。TCP模块通常将MSS设置为(MTU-40)字节(减掉的这40字节包括20字节的TCP头部和20字节的IP头部)。这样携带TCP报文段的IP数据报的长度就不会超过MTU(假设TCP头部和IP头部都不包含选项字段,并且这也是一般情况),从而避免本机发生IP分片。对以太网而言,MSS值是1460(1500-40)字节
  • kind=3,窗口扩大因子选项:是一个用来改善TCP吞吐量的选项。 TCP连接初始化时,通信双方使用该选项来协商接收窗口的扩大因子。 在TCP的头部中,接收窗口大小是用16位表示的,故最大为65535字节,但实际上TCP模块允许的接收窗口大小远不止这个数(为了提高TCP通信的吞吐量)。 窗口扩大因子解决了这个问题。 假设TCP头部中的接收通告窗口大小是N,窗口扩大因子(移位数)是M,那么TCP报文段的实际接收通告窗口大小是N*2M,或者说N左移M位

3. Wireshark抓包分析

将Socket API编程模型一文中的TCP Server工程源码下载到开发板中,用网线将PC和开发板相连接,开启一个TCP客户端,打开wireshark软件,监听IP地址192.168.1.10

在TCP客户端发送数据

TCP协议

wireshark抓取到相应的TCP数据包,客户机向主机发送数据:ACK=1表示确认序号字段有效,PSH=1表示接收方应该尽快将这个报文段交给应用层

TCP协议

主机收到数据后立即返回相应数据给客户机,ACK=1表示确认序号字段有效,PSH=1表示接收方应该尽快将这个报文段交给应用层

TCP协议

客户机再次给出响应到主机,ACK=1表示确认序号字段有效,PSH=0表示没有数据传递

TCP协议

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分