TCP/IP数据包解析示例

来源:互联网 发布:东华软件数据库 编辑:程序博客网 时间:2024/06/05 04:25

IP和谈(Internet Protocol)是收集层和谈,用在因特网上,TCP,UDP,ICMP,IGMP数据都是遵守IP数据格局发送得。IP和谈供给的是不成靠无连接得办事。IP数据包由一个头部和一个正文项目组构成。正文主如果传输的数据,IP头部由20字节的固定长度和一个可选随便率性长度项目组构成,以大段点机次序传送,从左到右,IP和谈数据包格局如下



TCP和谈(TRANSMISSION CONTROL PROTOCOL)是传输层和谈,为应用层供给办事,和UDP不合的是,TCP和谈供给的靠得住的面向连接的办事,跟IP头部差不久不多,根蒂根基的长度也是20字节。TCP数据包是包含在一个IP数据报文中的,TCP数据包如下




这是一次FTP的连接,呵呵,是cuteftp默认的cuteftp的FTP站点,IP地址是:216.3.226.21。我的IP地址假设为: 192.168.1.1。下面的数据就是TCP/IP连接过程中的数据传输。我们可以解析TCP/IP和谈数据格局以及TCP/IP连接的三次握手景象。下面的这些十六进制数据只是TCP/IP和谈的数据,不是完全的收集通信数据。 


  第一次,我向FTP站点发送连接恳求(TCP数据的可选项目组去掉了) 


  192.168.1.1->216.3.226.21 


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


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


  第一字节,"45",此中"4"是IP和谈的版本(Version),申明是IP4。"5"是IHL位,默示IP头部的长度,是一个4bit字段,最大就是1111了,值为15,IP头部的最大长度就是60字节。而这里为"5",申明是20字节,这是标准的IP头部长度,头部报文中没有发送可选项目组数据。 


  接下来的一个字节"00"是办事类型(Type of Service)。这个8bit字段由3bit的优先权子字段(如今已经被忽视),4 bit的TOS子字段以及1 bit的未用字段(如今为0)构成.4 bit的TOS子字段包含:最小延时、最大吞吐量、最高靠得住性以及最小费用构成,这四个1bit位最多只能有一个为1,本例中都为0,默示是一般办事。 


  接着的两个字节"00 30"是IP数据报文总长,包含头部以及数据,这里默示48字节。这48字节由20字节的IP头部以及28字节的TCP头构成(底本截取的TCP头应当是28字节的,此中8字节为可选项目组,被我省去了)。是以今朝最大的IP数据包长度是65535字节。 


  再是两个字节的标记位(Identification):"5252",转换为十进制就是21074。这个是让目标主机来断定新来的分段属于哪个分组。 


  下一个字节"40",转换为二进制就是"0100 0000",此中第一位是IP和谈今朝没有效上的,为0。接着的是两个标记DF和MF。DF为1默示不要分段,MF为1默示还有进一步的分段(本例为0)。然后的"0 0000"是分段便移(Fragment Offset)。 


  "80"这个字节就是TTL(Time To Live)了,默示一个IP数据流的生命周期,用Ping显示的成果,能获得TTL的值,很多文章就说经由过程TTL位来判别主机类型。因为一般主机都有默认的TTL值,不合体系的默认值不一样。比如WINDOWS为128。不过,一般Ping获得的都不是默认值,这是因为每次IP数据包经过一个路由器的时辰TTL就减一,当减到0时,这个数据包就灭亡了。这也时Tracert的道理。本例中为"80",转换为十进制就是128了,我用的WIN2000。 


  持续下来的是"06",这个字节默示传输层的和谈类型(Protocol)。在RFC790中有定义,6默示传输层是TCP和谈。 


  "2c 23"这个16bit是头校验和(Header Checksum)。 


  接下来"c0 a8 01 01",这个就是源地址(Source Address)了,也就是我的IP地址。


  转换为十进制的IP地址就是:192.168.1.1,同样,持续下来的32位"d8 03 e2 15"是目标地址,216.3.226.21 


  好了,这就是20字节的IP数据报头了。持续看TCP的头部吧,这个是作为IP数据包的数据项目组传输的。 



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


  一来就是一个两字节段"0d 28",默示本地端标语,转换为十进制就是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 sender)用来开释连接,注解发送方已经没稀有据发送了。 


  这6个标记位,对号入座。本例中SYN=1,ACK=0,当然就是默示连接恳求了。我们可以重视下面两个过程的这两位的变换。 


  后面的"40 00 c0 29 00 00"不讲了。后面两次通信的数据,分隔看吧。我们看看连接的过程,一些首要处所的变更。 



  第二次,FTP站点返回一个可以连接的旌旗灯号。 


  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 


  看看全部Threeway_handshake过程。 


  第一步,我发出连接恳求,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。 


  正式建树连接了呢,这些器材是什么值? 


  我接管从216.3.226.21->192.168.1.1的下一个数据包中: 


  SEQ=4b 4f 45 c2,ACKNUM=50 5f a9 07,SYN=0,ACK=1这些就是TCP三次握手所传输的数据了

原创粉丝点击