(原创)如何利⽤UDP协议封装⼀个数据包
  在如何封装⼀个数据包上,是⼀个⾮常细致的问题,⽽利⽤UDP协议来封装的话,是⽐较简单,让我们⼀步步来分析典型的TCP/IP协议。⼀般来说⼀个典型的⼀个数据包,包括以太⽹MAC头+⽹络层IP数据头+传输层UDP头+要传输的数据。让我们⼀层层来看看这些数据头是如何构成的。
1、以太⽹MAC头
  ⼀般情况下,以太⽹MAC头由14个字节构成,12个⾃⼰的MAC地址+上层协议的标识符。举个例⼦
  如果你要发送的⽬标MAC位00:1d:09:10:d1:9c,⽽你的MAC地址为01:60:6e:11:02:0f,上层⼀般都是⽹络层,即为IP层,IP层的标识符为0x8000,那么你的以太⽹MAC头就为
  00 1d 09 10 d1 9c 01 60 6e 11 02 0f 80 00.
  8字节的前导⽤于帧同步,CRC域⽤于帧校验。这些⽤户不必关⼼其由⽹卡芯⽚⾃动添加。⽬的地址和源地址是指⽹卡的物理地址,即MAC地址,具有唯⼀性。帧类型或协议类型是指数据包的⾼级协议,如 0x0806表⽰ARP协议,0x0800表⽰IP协议等。 
2、⽹络层IP头
  0x45, 0x00, IPlenght_h, IPlenght_l,
tcp ip协议规定
  0x00, 0x00, 0x00, 0x00, 0x80, 0x11,
  IPchecksum4, IPchecksum5,
  IPsource_1, IPsource_2, IPsource_3, IPsource_4,IPdestination_1, IPdestination_2, IPdestination_3, IPdestination_4
  上⾯是⼀个简单的ip头的例⼦,下⾯⼀个个的来解释啊!
  0x45,其中的⾼位0x4,表⽰的是版本号,ipv4的意思,⽽后⾯低字节5表⽰的是指明IPv4协议包头长度的字节数包含多少个32位,这⾥是5,也就是说协议头是5*4=20个字节的⼤⼩。
  0x00,定义IP封包在传送过程中要求的服务类型,如果所有4bit均为0,那么就意味着是⼀般服务,具体如下:
    ◆ (Routine): 过程字段,占3位。设置了数据包的重要性,取值越⼤数据越重要,取值范围为:0(正常)~ 7(⽹络控制)
    ◆...0....(Delay):延迟字段 ,占1位,取值:0(正常)、1(期特低的延迟)
    ◆....0...(Throughput):流量字段,占1位。取值:0(正常)、1(期特⾼的流量)
    ◆.....0..(Reliability) :可靠性字段,占1位。取值:0(正常)、1(期特⾼的可靠性)
    ◆…..0.(ECN-Capable Transport):显式拥塞指⽰传输字段,占1位。由源端设置,以显⽰源端节点的传输协议是⽀持ECN(Explicit Cogestion Notifica tion,显式拥塞指⽰)的。取值:0(不⽀持ECN)、1(⽀持ECN)
    ◆.......0(Congestion Experienced):拥塞预警字段,占1位。取值:0(正常,不拥塞)、1(拥塞)
  IPlenght_h, IPlenght_l,表⽰的是包总长度=IP头长度+UDP头长度+数据长度,最后讲长度分为⾼8位和低8位。
  0x00, 0x00,是上⾯的标志位,16个字节。每⼀个IP封包都有⼀个16位的唯⼀识别码。当程序产⽣的数据要通过⽹络传送时都会被拆散成封包形式发送,当封包要进⾏重组的时候这个ID就是依据了。
  0x00, 0x00这16位是由两部分组成,包括3bit的标记位和13bit的分段偏移量。
    这是当封包在传输过程中进⾏最佳组合时使⽤的3个bit的识别记号。占3位。
    ◆000(Reserved Fragment):保留分段。当此值为0的时候表⽰⽬前未被使⽤。
    ◆.0.(Don't Fragment):不分段。当此值为0的时候表⽰封包可以被分段,如果为1则不能被分割。
    ◆..0( More Fragment):更多分段。当上⼀个值为0时,此值为0就⽰该封包是最後⼀个封包,如果为1则表⽰其後还有被分割的封包。
    IP协议头格式规定当封包被分段之后,由于⽹路情况或其它因素影响其抵达顺序不会和当初切割顺序⼀⾄,所以当封包进⾏分段的时候会为各⽚段做好定位记录,以便在重组的时候就能够
    对号⼊座。值为多少个字节,如果封包并没有被分段,则FO值为“0"。占13位。
  0x80表⽰⽣存时间。⽣存时间字段设置了数据报可以经过的最多路由器数,表⽰数据包在⽹络上⽣存多久。TTL的初始值由源主机设置(通常为32或64),⼀旦经过⼀个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP消息通知源主机。这样当封包在传递过程中由於某些原因⽽未能抵达⽬的地的时候就可以避免其⼀直充斥在⽹路上⾯。占8位。
  0x11表⽰的是传输层的协议。如下表所⽰:
  IPchecksum4, IPchecksum5这两个是头校验和的⾼8位和低8位。
  指IPv4数据报包头的校验和。这个数值⽤来检错⽤的,⽤以确保封包被正确⽆误的接收到。当封包开始进
⾏传送后,接收端主机会利⽤这个检验值会来检验余下的封包,如果⼀切⽆误就会发出确认信息表⽰接收正常。与UDP和TCP协议包头中的校验和作⽤是⼀样的。占16位。
  ⾸部检验和字段是根据IP⾸部计算的检验和码,不对⾸部后⾯的数据进⾏计算。ICMP、IGMP、UDP和TCP协议在它们各⾃的⾸部中均含有同时覆盖⾸部和数据检验和码。
  IP协议头格式规定了:计算⼀份数据报的IP检验和,⾸先把检验和字段置为0。然后,对⾸部中每个16位进⾏⼆进制反码求和(整个⾸部看成是由⼀串16位的字组成),结果存在检验和字段中。当接收端收到⼀份IP数据报后,同样对⾸部中每个16 位进⾏⼆进制反码的求和。由于接收⽅在计算过程中包含了发送⽅存在⾸部中的检验和,因此,如果⾸部在传输过程中没有发⽣任何差错,那么接收⽅计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不⽣成差错消息,由上层去发现丢失的数据报并进⾏重传。
  ICMP、IGMP、UDP和TCP都采⽤相同的检验和算法,尽管TCP和UDP除了本⾝的⾸部和数据外,在IP⾸部中还包含不同的字段。由于路由器经常只修改TTL字段(减1),因此当路由器转发⼀份消息时可以增加它的检验和,⽽不需要对IP整个⾸部进⾏重新计算。
  IPsource_1, IPsource_2, IPsource_3, IPsource_4,IPdestination_1, IPdestination_2, IPdestination_3, IPdestination_4这两个就表⽰了源IP和⽬标IP。
3、UDP数据头
0x04, 0x00,0x04, 0x00, lenght_h, lenght_l, 0x00, 0x00 
  0x04, 0x00表⽰的是UDP的源端⼝,这⾥为1024;
  0x04, 0x00表⽰的是UDP的⽬标端⼝,这⾥为1024;
  lenght_h, lenght_l,为整个数据包的长度,包括MAC头+ip头+UDP头+校验位。
  0x00, 0x00这些是UDP协议的选项和填充位。
  这两个选项较少使⽤,只有某些特殊的封包需要特定的控制才会利⽤到。这些选项通常包括:
  ◆安全和处理限制:⽤于军事领域
  ◆记录路径:让每个路由器都记下它的IP地址
  ◆时间戳:让每个路由器都记下它的IP地址和时间
  ◆宽松的源站选路:为数据报指定⼀系列必须经过的IP地址
  ◆严格的源站选路:与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址。
  以上这些选项很少被使⽤,⽽且并⾮所有的主机和路由器都⽀持这些选项。
 总结:
  上⾯是对⼀个UDP封装数据的总结,便于以后更好的记忆。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。