首页 > 技术文章 > TCP/IP头部详解

zzq919101 2017-11-20 16:39 原文

在网上找了很多有关tcp/ip头部解析的资料,都是类似于下面的结构

抽象出图文是这种结构,但是在底层中数据到底是怎么传输的呢?没有答案,在深入学习之后,总结出数据传输的方式

IP数据包头部格式:

上面是在数据到达传输层对数据进行IP头部封装的数据

TCP协议

TCP协议是传输协议,为应用层提供数据服务,和UDP不同,TCP提供可靠的面向连接服务,关于TCP头部数据格式的说明

跟IP头部差不多,基本长度为20个字节,基本介绍到此为止,详解在网上多如牛毛,下面用两台pc建立连接为例说明:

主机1:IP地址为192.168.1.1

主机2: IP地址为216.3.226.21

下面是TCP/IP传输的数据,下面这些为十六进制TCP/IP协议的数据,不是完整的网络通信数据

第一次:向web站点发送连接请求

192.168.1.246 -> 123.56.106.180

IP头部:45 00 00 30 52 52 40 00 80 06 2c 23 c0 a8 01 01 d8 03 e2 15

转化成二进制:1000100111011111111111011111111111100101111111101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

TCP头部:0d 28 00 15 50 5f a9 06 00 00 00 00 70 02 40 00 c0 29 00 00

转化成二进制:1100111100100111111011111111111100010100111101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

来看看IP头部的数据都表示什么:

第一个字节 45:其中'4'代表IP的版本协议,说明是IPV4,'5'标识IP头部长度,是一个4bit的字段,最大值就是1111了,IP头部最大长度为60字节,最大值12,而这里的'5',说明有20个字节的长度,这是标准的IP头部长度。

接下来是 00:是服务类型,由8个bit构成,每2个bit分别标识:最小延时、最大吞吐量、最高可靠性、以及最小费用。这四个1bit同时只能有1个为1。本例中都为0表示一般服务。

接下来 00 30:是IP数据报文的总长,包含头部以及数据,这里表示48字节,这48字节表示由20字节的IP头部,和28字节的TCP头部构成。

接下来 52 52:转换为十进制就是21074。这个是让目的主机来判断新来的分段属于哪个分组。  

接下来 转换为二进制就'0100 0000',其中第一位是IP协议目前没有用上的,为0。接着的是两个标志DF和MF。DF为1表示不要分段,MF为1表示还有进一步的分段(本例为0)。然后的“0 0000”是分段便移

接下来 80:这个字节就是TTL,表示一个IP数据流的生命周期。转化成10进制为128,说明该数据包最多经过128次路由将被丢弃,每路由一次,TTL的值减1。

接下来 '06',这个字节表示传输层的协议类型。在RFC790中有定义,6表示传输层是TCP协议。

接下来 '2c 23'这个16bit是头校验和。

接下来“c0 a8 01 01”,这个就是源地址(Source Address)了,也就是主机1的IP地址。转换为十进制的IP地址就是:192.168.1.1,同样,继续下来的32位“d8 03 e2 15”是目标地址,216.3.226.21

至此IP数据头部大概解析完成,接下来解析TCP头部

TCP头部:0d 28 00 15 50 5f a9 06 00 00 00 00 70 02 40 00 c0 29 00 00

两字节段'0d 2',表示本地端口号,转换为十进制就是3368。第二个两字节段'00 15'表示目标端口,因为我是连接FTP站点,所以,这个就是21啦,十六进制当然就是'00 15'。

 

接下来的四个字节“50 5f a9 06”是顺序号(Sequence Number),简写为SEQ,SEQ=1348446470下面的四个字节“00 00 00 00”是确认号(Acknowledgment Number),简写为ACKNUM。

继续两个字节,'70 02',转换为二进制吧,“0111 0000 0000 0010”。这两个字节,总共16bit,有好多东西呢。第一个4bit'0111',是TCP头长,十进制为7,表示28个字节(刚才说了,我省略了8字节的option数据,所以你只看见了20字节)。接着的6bit现在TCP协议没有用上,都为0。最后的6bit“00 0010”是六个重要的标志。这是两个计算机数据交流的信息标志。接收和发送断根据这些标志来确定信息流的种类(三次握手和四次握手机制)。下面是一些介绍:

URG:(Urgent Pointer field significant)紧急指针。用到的时候值为1,用来处理避免TCP数据流中断 

ACK:(Acknowledgment fieldsignificant)置1时表示确认号(AcknowledgmentNumber)为合法,为0的时候表示数据段不包含确认信息,确认号被忽略。

PSH:(Push Function),PUSH标志的数据,置1时请求的数据段在接收方得到后就可直接送到应用程序,而不必等到缓冲区满时才传送。 

RST:(Reset the connection)用于复位因某种原因引起出现的错误连接,也用来拒绝非法数据和请求。如果接收到RST位时候,通常发生了某些错误。

SYN:(Synchronize sequence numbers)用来建立连接,在连接请求中,SYN=1,ACK=0,连接响应时,SYN=1,ACK=1。即,SYN和ACK来区分Connection Request和Connection Accepted。

FIN:(No more data from sender)用来释放连接,表明发送方已经没有数据发送了。

这6个标志位,自己对号入座吧。本例中SYN=1,ACK=0,当然就是表示连接请求了。我们可以注意下面两个过程的这两位的变换。

后面的“40 00 c0 29 00 00”不讲了,呵呵,偷懒了。后面两次通讯的数据,自己分开看吧。我们看看连接的过程,一些重要地方的变化。

第二次,web站点返回一个可以连接的信号。 

  216.3.226.21->192.168.1.1 

  IP头部: 45 00 00 2c c6 be 40 00 6a 06 cd ba d8 03 e2 15 c0 a8 01 01  

  TCP头部:00 15 0d 28 4b 4f 45 c1 50 5f a9 07 60 12 20 58 64 07 00 00

第三次,我确认连接。TCP连接建立起来。  

  192.168.1.1->216.3.226.21  

  IP头部: 45 00 00 28 52 53 40 00 80 06 2c 2a c0 a8 01 01 d8 03 e2 15  

  TCP头部:0d 28 00 15 50 5f a9 07 4b 4f 45 c2 50 10 40 b0 5b 1c 00 00

  第一步,我发出连接请求,TCP数据为:SEQ=50 5f a9 06,ACKNUM=00 00 00 00,SYN=1,ACK=0。  

  第二步,对方确认可以连接,TCP数据为:SEQ=4b 4f 45 c1,ACKNUM=50 5f a9 07,SYN=1,ACK=1。  

  第三步,我确认建立连接。SEQ=50 5f a9 07, ACKNUM=4b 4f45c2,SYN=0,ACK=1。  

可以看出什么变化么?正式建立连接了。在之后的数据传输中,携带ACK进行安全传输

接收从216.3.226.21->192.168.1.1的下一个数据包中:SEQ=4b 4f 45 c2,ACKNUM=50 5f a9 07,SYN=0,ACK=1

至此基本的分析完成,其中有很多细节需要深入理解,这里不再一一赘述。

 

推荐阅读