简介
TCP报文段是由TCP首部和TCP数据部分组成。 应用层发送的数据包通过TCP、IP层和数据链路层的封装最后转为数据帧发送至网络,具体的分发过程如下:
TCP首部详解
1、源端口:源端口和IP地址的作用是标识报文的返回地址; 2、目的端口:端口指明接收方计算机上的应用程序接口; TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。 3、序号字段:占4字节。TCP连接中传送到数据流中的每一个字节都编上一个序号,序号字段的值则是指的是本报文段发送的数据组的第一个字节的序号; 4、确认号字段:占4字节。是期望收到对方下一个报文段的数据的第一个字节的序号,确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0; 5、数据偏移/首部长度:4位。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值; 6、保留字段:占6位。保留为今后使用,但目前应置为0; 7、控制位:每一个标志位表示一个控制功能;
URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针;
ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段;
PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队;
RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求;
SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1;
FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。
8、窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535; 9、校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证; 10、紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式; 11、选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍,我们通过第5条数据偏移位可知tcp报头最长为60字节,而前面10条共占20字节,故还有40字节的可选消息; 12、填充字段:这是为了使整个首部长度是4字节的整数倍。
注意: TCP的确认是接收到的数据的最高序号表示确认。接收端返回的确认号是已收到的数据的最高序号+1。因此确认号表示接收端期望下次收到的数据中的第一个数据字节的序号。 为了提高效率,TCP可以累计确认,即在接收多个报文段后,一次确认。 在第一个报文(从右往左)中序号为300,而报文占100个字节,则下一个报文的序号为400,以此类推。 其他相关链接:
TCP三次握手和四次挥手详解
socket通信原理及相关函数详细总结
|