首部结构
源端口:占2个字节,写入源端口号,标识不同的应用层协议。
目的端口:占2个字节,写入目的端口号,标识不同的应用层协议。
序号seq:占4个字节。序号范围是[0,232-1],共232(即4,294,967,296,最大传4G数据)个序号,首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号。
确认号ack:占4个字节。是期望收到对方下一个报文段的第一个数据字节的序号。
数据偏移:占4位,单位为4个字节。表示首部长度。它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。 由于4位二进制数能够表示的最大十进制数是15,因此数据偏移的最大值是60字节。
保留:目前没有用,设为0。
紧急URG:URGent,当URG=l时,表明紧急指针字段有效。
确认ACK:ACKnowlegment,仅当ACK=1时确认号字段才有效。
推送PSH:PuSH,当两个应用进程进行交互式的通信时,有时一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP就可以使用推送(Push)操作。
复位RST:ReSeT,当RST=l时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。
同步SYN:SYNchronization,在连接建立时用来同步序号。
终止FIN:FINish,用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据己发送完毕,并要求释放传输连接。
窗口:占2字节,窗口值是[0,216-1]之间的整数。TCP协议有流量控制功能,窗口值用来告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(单位是字节)。
检验和:占2字节,检验和字段检验的范围包括首部和数据这两部分。
紧急指针:占2字节,紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。
选项:长度可变,最长可达40字节。当没有使用选项时,TCP的首部长度是20字节。TCP最初只规定了一种选项,即最大报文段长度(Maximum Segment Size,MSS)。
序号与确认号
A发送文件给B,由于文件内容过大,进行分段发送,各段说明:
- A向B发送第1个数据包,TCP首部中Sequence Number(序号)=1,发送了100个字节,共100字节;
- A向B发送第2个数据包,TCP首部中Sequence Number(序号)=101,发送了100个字节,共200字节;
- B向A发送确认数据包,TCP首部中Acknowledgment Number(确认号)=201,表示已经接收到200字节,期望再接收从201开始的数据。补充说明:若A、B相互发送消息,确认包可以随B往A发送的消息中携带,否则B会返回一个只有首部没有数据的确认包。
- A向B发送第3个数据包,TCP首部中Sequence Number(序号)=201,发送了100个字节,共300字节;
Urgent标记位
例如:在cmd窗口输入命令连接ftp,put上传文件的过程中ctrl+c命令,就会出现urgent标记选项
最大数据帧大小MSS
MSS( Maximum segment size)报文数据最大为1460字节,因为MTU(Maximum Transmission Unit)最大传输单元是1500字节,网络层首部、传输层首部最小20字节选择性确认SACK
因为tcp首部最大60字节,固定有20字节,选项可用40字节。SACK中kind占1个字节,长度占1个字节,则剩余38个字节可用,其中左边界4个字节,又边界4个字节,则选择性确认最多支持8个边界。
通过SACK选项可以使TCP发送方只发送丢失的数据而不用发送后续全部数据,提高了数据的传输效率。