分类 网络协议 下的文章

先看下ip报头各部分所占内存大小的分布图:

然后下面是wireshack下捕获的包中的ip报头:

上面的结果是wireshack为了方便我们理解而产生的优化效果,其实它真正传输的内容是下面这串数据,一共57帧 20个字节的数据。

450000284f7740008006f4e7c0a800672f67c5fa

那我们去理解这串的内容呢?我把数据进行了分组,然后解释它的含义

1. 这个“4”代表的是协议的版本号(version);也就是表示下面使用的是ipv4版本的ip地址类型,它的二进制格式是“0100”,所占大小为4bit。

2. 这个“5”大小4bit,它的二进制是“0101”;代表IP包头长度(Header Length),也就是我们正在解释的这串数据的长度,这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。该部分占4个bit位,单位为32bit(4个字节),即本区域值= IP头部长度(单位为bit)/(8*4),因此,一个IP包头的长度最长为“1111”,即15*4=60个字节。IP包头最小长度为20字节。

3. “0000”表示的是服务类型(Type of Service,长度8比特。它的二进制是“00000000”,8位按位被如下定义 PPP D T R C 0,我们把它进行分成6组,分别解释

000(PPP)    0(D)   0(T)   0(R)   0(C)   0(O)

PPP:定义包的优先级
   000 普通 (Routine)
   001 优先的 (Priority)
   010 立即的发送 (Immediate)
   011 闪电式的 (Flash)
   100 比闪电还闪电式的 (Flash Override)
   101 CRI/TIC/ECP (不知道虾米意思)
   110 网间控制 (Internetwork Control)
   111 网络控制 (Network Control)

D 时延: 0:普通 1:尽量小
T 吞吐量: 0:普通 1:尽量大
R 可靠性: 0:普通 1:尽量大
M 传输成本: 0:普通 1:尽量小
0 最后一位被保留,恒定为0

4.“28”是16进制数,转换成10进制就是40,它代表IP包总长(Total Length):长度16比特。 以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。

5.“4f77是16进制数,10进制值是20343,代表(数据报ID):长度16比特。该字段和Flags和Fragment Offest字段联合使用,对大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分

6.“4000”的二进制是“01000000 00000000”,所占大小2字节,它这里代表了两组参数,第一组占3个bit,第二组占13bit。

010(Flags)  0000000000000(Fragment Offset))

标记(Flags):长度3比特。该字段第一位不使用。第二位是DF(Don't Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。

片偏移(Fragment Offset):长度13比特。表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包。

7."80"代表的10进制数是128,它的含义是生存时间(TTL):长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。


8."06"表示的是下层协议是TCP协议(因为我抓的这个包是TCP包,他是一个三层协议的包,第一层是以太网包,第二层是IP包,第三层是TCP包)。

协议(Protocol):长度8比特。标识了上层所使用的协议。
以下是比较常用的协议号:
    1    ICMP
    2    IGMP
    6    TCP
   17   UDP
   88   IGRP
   89   OSPF

9."f4e7"代表头部校验(Header Checksum):大小16位,用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改
变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。

10.起源和目标地址(Source and Destination Addresses):这两个地段都是32比特。标识了这个IP包的起源和目标地址。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变。

关于它的计算,我以来源地址为例,首先把16进制数 c0a80067 转为10进制得到一个数 ‭3232235623‬,这是网络数字地址,它与IP地的关系为:

IP: 192.168.0.103     192*256^3 + 168*256^2 + 0*256^1 + 103*256*0 =  ‭3232235623‬(数字地址)

其他可选项(Options):这是一个可变长的字段。该字段属于可选项,主要用于测试,由起源设备根据需要改写。可选项目包含以下内容:
    松散源路由(Loose source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,但是允许在相继的两个IP地址之间跳过多个路由器。

    严格源路由(Strict source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,如果下一跳不在IP地址表中则表示发生错误。

    路由记录(Record route):当IP包离开每个路由器的时候记录路由器的出站接口的IP地址。

    时间戳(Timestamps):当IP包离开每个路由器的时候记录时间。

填充(Padding):因为IP包头长度(Header Length)部分的单位为32bit,所以IP包头的长度必须为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍。




部分参考:http://www.360doc.com/content/12/0329/14/9210126_198940526.shtml

表1 公共头部

 字段 说明
 Remote Address 请求的远程地址
 Request URL 请求的域名
 Request Method 页面请求的方式:GET/POST
 Status Code 请求的返回状态

  表2 请求头

 字段 说明
 Accept 表示浏览器支持的 MIME 类型
 Accept-Encoding 浏览器支持的压缩类型
 Accept-Language 浏览器支持的语言类型,并且优先支持靠前的语言类型
 Cache-Control指定请求和响应遵循的缓存机制 
 Connection 当浏览器与服务器通信时对于长连接如何进行处理:close/keep-alive
 Cookie 向服务器返回cookie,这些cookie是之前服务器发给浏览器的
 Host 请求的服务器主机名
 Referer 该页面的来源URL地址
 User-Agent 用户客户端的一些必要信息

   表3 返回头

 字段 说明
 Cache-Control 告诉浏览器或者其他客户,什么环境可以安全地缓存文档
 Connection 当client和server通信时对于长链接如何进行处理
 Content-Encoding 数据在传输过程中所使用的压缩编码方式
 Content-Type 数据的类型
 Date 数据从服务器发送的时间
 Expires 应该在什么时候认为文档已经过期,从而不再缓存它?
 Server 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置
 Set-Cookie 设置和页面关联的cookie
 Transfer-Encoding 数据传输的方式

1xx(临时响应)

含义:表示临时响应并需要请求者继续执行操作的状态代码。
  • 100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
  • 101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。

2xx (成功)

含义:表示成功处理了请求的状态代码。
  • 200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
  • 201 (已创建) 请求成功并且服务器创建了新的资源。
  • 202 (已接受) 服务器已接受请求,但尚未处理。
  • 203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
  • 204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
  • 205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
  • 206 (部分内容) 服务器成功处理了部分 GET 请求。

3xx (重定向)

含义:表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
  • 300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
  • 301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
  • 302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
  • 303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
  • 304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
  • 305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
  • 307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

4xx(请求错误)

含义:这些状态代码表示请求可能出错,妨碍了服务器的处理。
  • 400 (错误请求) 服务器不理解请求的语法。
  • 401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
  • 403 (禁止) 服务器拒绝请求。
  • 404 (未找到) 服务器找不到请求的网页。
  • 405 (方法禁用) 禁用请求中指定的方法。
  • 406 (不接受) 无法使用请求的内容特性响应请求的网页。
  • 407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
  • 408 (请求超时) 服务器等候请求时发生超时。
  • 409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
  • 410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
  • 411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
  • 412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
  • 413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
  • 414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
  • 415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
  • 416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
  • 417 (未满足期望值) 服务器未满足”期望”请求标头字段的要求。

5xx(服务器错误)

含义:这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。 
  • 500 (服务器内部错误) 服务器遇到错误,无法完成请求。
  • 501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
  • 502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
  • 503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
  • 504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
  • 505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。