TCP协议以及其报头结构分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MBuger/article/details/74078777

简介

TCP协议是TCP/IP协议族中的一个重要协议,与IP协议相比,TCP协议更靠近应用层,属于传输层协议,因此在应用程序中具有更强的可操作性。一些重要的socket选项都和TCP协议相关。

TCP协议的特点

传输层的主要协议有两个:TCP和UDP,总的来说TCP协议相对于UDP协议的特点是:面向连接,字节流和可靠性。

1.使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写。
2.双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上的数据传输。
3.TCP为全双工,即双方数据读写可以通过一个连接进行,所以完成数据交换之后,通信双方都必须断开连接以释放系统资源。
4.TCP协议的连接用于一对一的通信,而UDP则适用于广播或者多播通信。
5.TCP传输是可靠的,因为TCP协议采用发送应答机制,即发送端发送的每个TCP报文都必须得到接收方的应答,才认为这个TCP报文段传输成功。其次TCP协议采用超时重传机制,发送端在发送出一个TCP报文段之后启动定时器,如果在定时时间内未收到应答,他将重发该报文段。

TCP报头结构

TCP报头

·16位端口号:告知主机该报文段是来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)。
·32位序号:一次TCP通信过程中的一个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机ISN(初始序号值)。那么在该传输方向上,后续的TCP报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。
·32位确认号:用作对另一个发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1.假设主机A和主机B进行TCP通信,那么A发送出的TCP报文段不仅携带自己的序号,而且包含对主机B发送来的TCP报文段的确认号。反之,B发出的TCP报文段也同时携带自己的序号和对A发送来的报文段的确认号。
·4位头部长度:标识该TCP头部有多少个32bit(4字节),四位最大表示15,所以TCP报头最长是60字节。
·6位标志位
URG:表示紧急指针是否有效。
ACK:表示确认号是否有效。我们称携带ACK标志的TCP报文段为确认报文段。
PSH:提示接收端应用程序应该立即从TCP接受缓冲区中读走数据,为接受后续数据腾出空间,如果不将接收到的数据读走,它们就会一直停留在TCP报文段。
RST:表示要求对方重新建立连接。我们称携带RST标志的TCP报文段为复位报文段。
SYN:表示请求建立一个新连接。称携带SYN标志位的TCP报文段为同步报文段。
FIN:表示通知对方本端要关闭连接了。称携带FIN标志的TCP报文段为结束报文段。
·16位窗口大小:这是TCP流量控制的一个手段。这里的窗口指的是接受通告的窗口。告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样就对方就可以控制发送数据的速度。
·16位校验和:由发送端填充,接收端对TCP报文端执行CRC算法以检验TCP报文段在传输过程中是否损坏(检验部分包括报头和数据部分)。
·16位紧急指针:为一个正的偏移量。它的序号字段的值相加表示最后一个紧急数据的下一个字节的序号。即紧急指针相对于当前序号的偏移。
·剩下40字节为选项字段。

使用tcpdump抓包查看

使用和telnet与主机建立连接,并用tcpdump抓包查看包内信息,得到下图。
TCP抓取TCP包
第一个包tcpdump输出Flag[S],表示该TCP报文段包含SYN标志位,因此它是一个同步报文段,表示请求一个新连接。第二个包Flag里为R则表示复位,中断该连接。如果TCP报文段包含其他标志,则tcpdump也会将该标志的首字母显示在“Flags”后的中括号中。
seq是序号值,因为这是整个通信过程中的第一个TCP报文段,所以他没有针对这个报文段的确认值ack。而第二个包为复位连接,所以seq置零。ack表示确认收到刚才发来的包,并给它加一。
win是接收通告窗口的大小。因为这是一个同步报文段,所以win值反映的是实际的接收通告窗口大小。第二个包中断了连接,所以窗口也置零
options里的内容则是TCP的选项字段。
length为TCP报文段数据部分的长度,因为应用层的数据交换,所以为0。

猜你喜欢

转载自blog.csdn.net/MBuger/article/details/74078777