IP、UDP初探

栏目: 服务器 · 发布时间: 7年前

内容简介:级别:★★☆☆☆标签:「IP首部」「UDP首部」「UDP」作者: WYW

级别:★★☆☆☆

标签:「IP首部」「UDP首部」「UDP」

作者: WYW

审校:QiShare团队

笔者最近了解了一下 Python 相关的内容,发现网络编程部分非常容易能够创建一个UDP本地服务器,正好可以用来分析一下UDP的请求和响应。在本篇文章中,笔者将给大家介绍下IP、UDP的部分内容。

OSI、IP、UDP 简介

聊到网络协议,我们常常会想到OSI(Open System Interconnection 开放式系统互联)七层模型、TCP/IP协议簇,她位于OSI、TCP/IP协议簇哪一层等问题。

如下图OSI七层模型及对应的TCP/IP协议簇所示。

  • UDP(User Datagram Protocol 用户数据报协议)位于OSI中的第四层(传输层)。位于TCP/IP协议簇中的第四层(TCP or UDP)。
  • IP(Internet Protocol 网络协议)OSI中的第三层(网络层),位于TCP/IP协议簇中的第三层(IP)。

下图 是OSI七层模型及对应的TCP/IP 协议簇

IP、UDP初探
User Datagram Protocol (UDP)
UDP is also a transport-layer protocol and is an alternative to TCP. It provides an unreliable datagram connection between applications. Data is transmitted link by link; there is no end-to-end connection. The service provides no guarantees. Data can be lost or duplicated, and datagrams can arrive out of order.
UDP也是传输层协议,是TCP的替代方案。  它在应用程序之间提供不可靠的数据报连接。 数据通过链接传输; 没有端到端的连接。  (这里我的理解是不需要建立连接)该服务不保证可靠传输。 数据可能丢失或重复,数据报可能无序到达。

Internet Protocol (IP)

In terms of the OSI model, IP is a network-layer protocol. It provides a datagram service between applications, supporting both TCP and UDP.

在OSI模型的中,IP是网络层协议。 它在应用程序之间提供数据报服务,支持TCP和UDP。

IP数据包首部及UDP首部

IP、UDP初探
IP、UDP初探

创建本地UDP服务器、客户端

笔者在前文提到了要用Python创建一个本地UDP服务器,并且分析UDP的请求及响应过程。这里笔者使用的是PythonIDE、Mac自带的终端简单创建了一个本地UDP服务端和客户端;

请求响应过程为:

-> 启动服务端

-> 启动客户端和服务端建立连接

-> 客户端向服务端发送数据'A'

-> 服务端收到数据向客户端发送'ABCD'。

-> 使用Wireshark对整个请求响应过程进行数据分析。

所用的Python代码如下:

  • Python IDE作为服务端使用如下代码,UDP服务端代码:
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 03:13:28) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license()" for more information.
>>> from socketserver import BaseRequestHandler, UDPServer
>>> class handleRequest(BaseRequestHandler):
    def handle(self):
        print('Got connection from', self.client_address)
        msg, sock = self.request
        print('RequestMessage:',msg)
        resp = 'ABCD'
        print('Response:',resp)
        sock.sendto(resp.encode('ascii'), self.client_address)

        
>>> if __name__ == '__main__':
    serv = UDPServer(('', 20000), handleRequest)
    serv.serve_forever()

复制代码
  • 终端作为客户端,使用如下代码,UDP客户端代码:
from socket import socket, AF_INET, SOCK_DGRAM
s = socket(AF_INET, SOCK_DGRAM)
s.sendto('A', ('localhost', 20000))
复制代码

示意图如下:

IP、UDP初探

抓包并进行分析

笔者结合着IP和UDP的首部示意图,及Wireshark的请求及响应进行了如下分析:

在分析数据传输过程之前,笔者先对下边会用到的名词及 工具 做个简单说明:

  • 字节byte比特bit ,1个字节(byte)=8个比特(bit)。

  • ASCII码:是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统。ASCII码对照表

  • 举个例子'A'的ASCII码为0x41 基本的16进制、2进制、10进制之间的转换 : -> 16进制0x41 -> 对应2进制为 0100 0001 -> 对应10进制为4 * 16 + 1 = 65在线进制转换

  • 下图是 请求 的示意图,可见数据部分是 0x41 表示的是十进制的65,即'A'的ASCII码。

    IP、UDP初探
  • 下图是 响应 的示意图,可见数据部分是 0x41424344 表示的是十进制的65 66 67 68,即'ABCD'的ASCII码。

    IP、UDP初探
IP、UDP初探
  • 下图标识的是 IP协议所使用的版本 ,0100表示的是4即IPv4
    IP、UDP初探
IP、UDP初探
  • 下图标识的是 IP的首部长度 ,0101表示十进制5,不过这里我们看到Header Length 为20字节,原因是,Head Length的单位是4字节。(即5 * 4 字节 = 20 字节)。首部长度的最大值为1111即15, 首部长度的最大值为15 * 4字节 = 60字节
    IP、UDP初探
IP、UDP初探
  • 服务类型 部分,优先级标志位和服务类型标志位,被路由器用来进行流量的优先排序。笔者目前不清楚用意,暂不做解释说明。

  • 下图为 Total Length(总长度) 显示为001d,16进制的d为13,即13 + 16 = 29。指IP首部和数据报中数据之后的长度,单位为字节。总长度为16位,因此数据报的最大长度为2 16 - 1 = 65535字节。

IP、UDP初探
IP、UDP初探
  • 下图为 标识符 ,一个唯一的标识数字,用来识别一个数据报或者被分片数据包的次序。目前笔者对此并不了解,暂不做解释。
    IP、UDP初探
IP、UDP初探
  • 下图为 标记和分段偏移

    IP、UDP初探
  • 标记 :用来标识一个数据报是否是一组分片数据包的一部分。

    • Flags:0x0000
      • 其中Reserved bit 为0 占用 1比特
      • DF(Don’t Fragment)为0,占用 1比特 ;代表不分片;
      • MF(More Fragemnt)为0,占用 1比特 ,MF为0,如果在分片的情况下,代表这是若干分片中的最后一个;
      • 分片偏移 为0,占用 13比特 ;0 0000 0000 0000
  • 分段偏移 :一个数据包是一个分片,这个域中的值就会被用来将数据报以正确顺序重新组装。目前笔者对此并不了解,暂不做解释。

  • 下图为 Time to live (存活时间) ,用来定义数据报的生存周期,以经过路由器的条数/秒数 进行秒数。目前笔者对此并不了解,暂不做解释。占用 8个比特 ,16进制0x40即十进制64。

IP、UDP初探
IP、UDP初探
  • 下图为 协议 ,用来识别在数据包序列中上层协议数据类型。占用 8 个比特,16进制0x11即十进制17。代表UDP。
    IP、UDP初探
IP、UDP初探
  • 下图为 首部校验和 ,一个错误检测机制,用来确定IP首部的内容有没有被损坏或者篡改。占用 16个比特
    IP、UDP初探
IP、UDP初探
  • 下图为 源IP地址 ,即发出数据报的主机的IP地址。占用 32个比特 。16进制的0x7f代表的127,0x7f00 0001 表示127.0.0.1
IP、UDP初探
IP、UDP初探
  • 下图为 目的IP地址 ,数据报目的地的IP地址。占用 32个比特 。16进制的0x7f代表的127,0x7f00 0001 表示127.0.0.1。
IP、UDP初探
IP、UDP初探

上述内容就是IP的数据报首部的相关分析,下边笔者将给大家介绍下UDP的首部的相关内容:

  • 如下图 UDP的首部 所示,UDP的首部占用 64比特,即8个字节
IP、UDP初探
IP、UDP初探
  • 下图表示 UDP的源端口 ,占用 16比特 。16进制为 0x f432 即为十进制的 62514
IP、UDP初探
IP、UDP初探
  • 下图表示 UDP的目标端口 ,占用 16比特 。16进制为 0x 4e20 即为十进制的 20000
    IP、UDP初探
IP、UDP初探
  • 下图表示 UDP数据报的字节长度 ,表示数据报的字节长度。长度占用UDP首部 16比特 。16进制为 0x 0009 即为十进制的 9 (因为UDP首部长度占8个字节,加上传输了一个数据'A'占用1个字节,共9字节)。
IP、UDP初探
IP、UDP初探
  • 下图表示 UDP数据报的校验和 ,用来确保UDP首部和数据到达时的完整性。校验和占用UDP首部 16比特 ,16进制为 0x fe1c 。目前笔者对这个值并不了解,暂不做解释。
IP、UDP初探
IP、UDP初探
  • 最后,传输的 数据 ,包含被UDP封装进去的数据,包含应用层协议头部和用户发出的数据,我们传输的'A',如下图,显示为16进制的0x41即十进制的65。
    IP、UDP初探

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Beginning iPhone and iPad Web Apps

Beginning iPhone and iPad Web Apps

Chris Apers、Daniel Paterson / Apress / 2010-12-15 / USD 39.99

It seems that everyone and her sister has developed an iPhone App—everyone except you, the hard-working web professional. And now with the introduction of the iPad, you may even feel farther behind. B......一起来看看 《Beginning iPhone and iPad Web Apps》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码

html转js在线工具
html转js在线工具

html转js在线工具