IP、UDP初探

级别:★★☆☆☆
标签:「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 协议簇


OSI TCP/IP Family

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数据包首部格式

创建本地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))

示意图如下:

UDP Server Client

抓包并进行分析

笔者结合着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码。

    请求

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

    响应

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

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

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

    标记分段偏移

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

    • 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。

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

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

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

参考内容:


了解更多iOS及相关新技术,请关注我们的公众号:

小编微信:可加并拉入《QiShare技术交流群》。

关注我们的途径有:
QiShare(简书)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公众号)

推荐文章:
iOS 多线程之GCD
iOS 多线程之NSOperation
iOS 多线程之NSThread
iOS Winding Rules 缠绕规则
iOS 签名机制
iOS 扫描二维码/条形码
奇舞周刊

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269