IP、UDP初探

級(jí)別:★★☆☆☆
標(biāo)簽:「IP首部」「UDP首部」「UDP」
作者: WYW
審校: QiShare團(tuán)隊(duì)


筆者最近了解了一下Python相關(guān)的內(nèi)容幌墓,發(fā)現(xiàn)網(wǎng)絡(luò)編程部分非常容易能夠創(chuàng)建一個(gè)UDP本地服務(wù)器囱稽,正好可以用來分析一下UDP的請(qǐng)求和響應(yīng)。在本篇文章中翰意,筆者將給大家介紹下IP、UDP的部分內(nèi)容巾兆。

OSI猎物、IP、UDP 簡(jiǎn)介

聊到網(wǎng)絡(luò)協(xié)議角塑,我們常常會(huì)想到OSI(Open System Interconnection 開放式系統(tǒng)互聯(lián))七層模型蔫磨、TCP/IP協(xié)議簇,她位于OSI圃伶、TCP/IP協(xié)議簇哪一層等問題堤如。

如下圖OSI七層模型及對(duì)應(yīng)的TCP/IP協(xié)議簇所示。

  • UDP(User Datagram Protocol 用戶數(shù)據(jù)報(bào)協(xié)議)位于OSI中的第四層(傳輸層)窒朋。位于TCP/IP協(xié)議簇中的第四層(TCP or UDP)搀罢。
  • IP(Internet Protocol 網(wǎng)絡(luò)協(xié)議)OSI中的第三層(網(wǎng)絡(luò)層),位于TCP/IP協(xié)議簇中的第三層(IP)侥猩。

下圖 是OSI七層模型及對(duì)應(yīng)的TCP/IP 協(xié)議簇


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也是傳輸層協(xié)議榔至,是TCP的替代方案。 它在應(yīng)用程序之間提供不可靠的數(shù)據(jù)報(bào)連接欺劳。 數(shù)據(jù)通過鏈接傳輸; 沒有端到端的連接唧取。 (這里我的理解是不需要建立連接)該服務(wù)不保證可靠傳輸铅鲤。 數(shù)據(jù)可能丟失或重復(fù),數(shù)據(jù)報(bào)可能無序到達(dá)枫弟。

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是網(wǎng)絡(luò)層協(xié)議。 它在應(yīng)用程序之間提供數(shù)據(jù)報(bào)服務(wù)淡诗,支持TCP和UDP骇塘。

IP數(shù)據(jù)包首部及UDP首部

IP數(shù)據(jù)包首部格式
UDP數(shù)據(jù)包首部格式

創(chuàng)建本地UDP服務(wù)器、客戶端

筆者在前文提到了要用Python創(chuàng)建一個(gè)本地UDP服務(wù)器韩容,并且分析UDP的請(qǐng)求及響應(yīng)過程款违。這里筆者使用的是PythonIDE、Mac自帶的終端簡(jiǎn)單創(chuàng)建了一個(gè)本地UDP服務(wù)端和客戶端宙攻;

請(qǐng)求響應(yīng)過程為:
-> 啟動(dòng)服務(wù)端
-> 啟動(dòng)客戶端和服務(wù)端建立連接
-> 客戶端向服務(wù)端發(fā)送數(shù)據(jù)'A'
-> 服務(wù)端收到數(shù)據(jù)向客戶端發(fā)送'ABCD'奠货。
-> 使用Wireshark對(duì)整個(gè)請(qǐng)求響應(yīng)過程進(jìn)行數(shù)據(jù)分析。

所用的Python代碼如下:

  • Python IDE作為服務(wù)端使用如下代碼座掘,UDP服務(wù)端代碼:
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

抓包并進(jìn)行分析

筆者結(jié)合著IP和UDP的首部示意圖溢陪,及Wireshark的請(qǐng)求及響應(yīng)進(jìn)行了如下分析:

在分析數(shù)據(jù)傳輸過程之前萍虽,筆者先對(duì)下邊會(huì)用到的名詞及工具做個(gè)簡(jiǎn)單說明:

  • 字節(jié)byte比特bit形真,1個(gè)字節(jié)(byte)=8個(gè)比特(bit)杉编。

  • ASCII碼:是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語(yǔ)和其他西歐語(yǔ)言咆霜。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng)邓馒。ASCII碼對(duì)照表

  • 舉個(gè)例子'A'的ASCII碼為0x41
    基本的16進(jìn)制、2進(jìn)制蛾坯、10進(jìn)制之間的轉(zhuǎn)換
    -> 16進(jìn)制0x41
    -> 對(duì)應(yīng)2進(jìn)制為 0100 0001
    -> 對(duì)應(yīng)10進(jìn)制為4 * 16 + 1 = 65 在線進(jìn)制轉(zhuǎn)換

  • 下圖是請(qǐng)求的示意圖光酣,可見數(shù)據(jù)部分是0x41表示的是十進(jìn)制的65,即'A'的ASCII碼脉课。

    請(qǐng)求

  • 下圖是響應(yīng)的示意圖救军,可見數(shù)據(jù)部分是0x41424344表示的是十進(jìn)制的65 66 67 68,即'ABCD'的ASCII碼倘零。

    響應(yīng)

Snip20181218_5.png
  • 下圖標(biāo)識(shí)的是IP協(xié)議所使用的版本唱遭,0100表示的是4即IPv4
    IPv4
IPv4
  • 下圖標(biāo)識(shí)的是IP的首部長(zhǎng)度,0101表示十進(jìn)制5呈驶,不過這里我們看到Header Length 為20字節(jié)拷泽,原因是,Head Length的單位是4字節(jié)。(即5 * 4 字節(jié) = 20 字節(jié))跌穗。首部長(zhǎng)度的最大值為1111即15订晌,首部長(zhǎng)度的最大值為15 * 4字節(jié) = 60字節(jié)
    IP首部長(zhǎng)度
IP首部長(zhǎng)度
  • 服務(wù)類型部分蚌吸,優(yōu)先級(jí)標(biāo)志位和服務(wù)類型標(biāo)志位,被路由器用來進(jìn)行流量的優(yōu)先排序砌庄。筆者目前不清楚用意羹唠,暫不做解釋說明。

  • 下圖為Total Length(總長(zhǎng)度)顯示為001d娄昆,16進(jìn)制的d為13佩微,即13 + 16 = 29。指IP首部和數(shù)據(jù)報(bào)中數(shù)據(jù)之后的長(zhǎng)度萌焰,單位為字節(jié)哺眯。總長(zhǎng)度為16位扒俯,因此數(shù)據(jù)報(bào)的最大長(zhǎng)度為216 - 1 = 65535字節(jié)奶卓。

Total Length
Total Length
  • 下圖為標(biāo)識(shí)符,一個(gè)唯一的標(biāo)識(shí)數(shù)字撼玄,用來識(shí)別一個(gè)數(shù)據(jù)報(bào)或者被分片數(shù)據(jù)包的次序夺姑。目前筆者對(duì)此并不了解,暫不做解釋掌猛。
    標(biāo)識(shí)符
標(biāo)識(shí)符
  • 下圖為標(biāo)記和分段偏移盏浙。

    標(biāo)記分段偏移

  • 標(biāo)記:用來標(biāo)識(shí)一個(gè)數(shù)據(jù)報(bào)是否是一組分片數(shù)據(jù)包的一部分。

    • Flags:0x0000荔茬,
      • 其中Reserved bit 為0 占用1比特废膘;
      • DF(Don’t Fragment)為0,占用1比特慕蔚;代表不分片丐黄;
      • MF(More Fragemnt)為0,占用1比特坊萝,MF為0孵稽,如果在分片的情況下,代表這是若干分片中的最后一個(gè)十偶;
      • 分片偏移為0菩鲜,占用 13比特;0 0000 0000 0000
  • 分段偏移:一個(gè)數(shù)據(jù)包是一個(gè)分片惦积,這個(gè)域中的值就會(huì)被用來將數(shù)據(jù)報(bào)以正確順序重新組裝接校。目前筆者對(duì)此并不了解,暫不做解釋。

  • 下圖為Time to live (存活時(shí)間)蛛勉,用來定義數(shù)據(jù)報(bào)的生存周期鹿寻,以經(jīng)過路由器的條數(shù)/秒數(shù) 進(jìn)行秒數(shù)。目前筆者對(duì)此并不了解诽凌,暫不做解釋毡熏。占用8個(gè)比特,16進(jìn)制0x40即十進(jìn)制64侣诵。

Time to live
Time to live
  • 下圖為協(xié)議痢法,用來識(shí)別在數(shù)據(jù)包序列中上層協(xié)議數(shù)據(jù)類型。占用8個(gè)比特杜顺,16進(jìn)制0x11即十進(jìn)制17财搁。代表UDP。
    協(xié)議
協(xié)議
  • 下圖為首部校驗(yàn)和躬络,一個(gè)錯(cuò)誤檢測(cè)機(jī)制尖奔,用來確定IP首部的內(nèi)容有沒有被損壞或者篡改桦卒。占用16個(gè)比特筒严。
    首部校驗(yàn)和
首部校驗(yàn)和
  • 下圖為源IP地址,即發(fā)出數(shù)據(jù)報(bào)的主機(jī)的IP地址殿如。占用32個(gè)比特膘滨。16進(jìn)制的0x7f代表的127甘凭,0x7f00 0001 表示127.0.0.1
源IP地址
源IP地址
  • 下圖為目的IP地址,數(shù)據(jù)報(bào)目的地的IP地址火邓。占用32個(gè)比特丹弱。16進(jìn)制的0x7f代表的127,0x7f00 0001 表示127.0.0.1铲咨。
目的IP地址
目的IP地址

上述內(nèi)容就是IP的數(shù)據(jù)報(bào)首部的相關(guān)分析躲胳,下邊筆者將給大家介紹下UDP的首部的相關(guān)內(nèi)容:

  • 如下圖UDP的首部所示,UDP的首部占用 64比特纤勒,即8個(gè)字節(jié)坯苹。
UDP的首部
UDP的首部
  • 下圖表示UDP的源端口,占用16比特摇天。16進(jìn)制為0x f432即為十進(jìn)制的62514粹湃。
UDP的源端口
UDP的源端口
  • 下圖表示UDP的目標(biāo)端口,占用16比特泉坐。16進(jìn)制為0x 4e20即為十進(jìn)制的20000为鳄。
    UDP的目標(biāo)端口
UDP的目標(biāo)端口
  • 下圖表示UDP數(shù)據(jù)報(bào)的字節(jié)長(zhǎng)度,表示數(shù)據(jù)報(bào)的字節(jié)長(zhǎng)度腕让。長(zhǎng)度占用UDP首部16比特孤钦。16進(jìn)制為0x 0009即為十進(jìn)制的9(因?yàn)閁DP首部長(zhǎng)度占8個(gè)字節(jié),加上傳輸了一個(gè)數(shù)據(jù)'A'占用1個(gè)字節(jié),共9字節(jié))偏形。
UDP數(shù)據(jù)報(bào)的字節(jié)長(zhǎng)度
UDP數(shù)據(jù)報(bào)的字節(jié)長(zhǎng)度
  • 下圖表示UDP數(shù)據(jù)報(bào)的校驗(yàn)和静袖,用來確保UDP首部和數(shù)據(jù)到達(dá)時(shí)的完整性。校驗(yàn)和占用UDP首部16比特俊扭,16進(jìn)制為0x fe1c队橙。目前筆者對(duì)這個(gè)值并不了解,暫不做解釋萨惑。
UDP數(shù)據(jù)報(bào)的校驗(yàn)和
UDP數(shù)據(jù)報(bào)的校驗(yàn)和
  • 最后喘帚,傳輸?shù)?code>數(shù)據(jù),包含被UDP封裝進(jìn)去的數(shù)據(jù)咒钟,包含應(yīng)用層協(xié)議頭部和用戶發(fā)出的數(shù)據(jù),我們傳輸?shù)?A'若未,如下圖朱嘴,顯示為16進(jìn)制的0x41即十進(jìn)制的65。
    傳輸?shù)臄?shù)據(jù)

參考內(nèi)容:


了解更多iOS及相關(guān)新技術(shù)粗合,請(qǐng)關(guān)注我們的公眾號(hào):

小編微信:可加并拉入《QiShare技術(shù)交流群》萍嬉。

關(guān)注我們的途徑有:
QiShare(簡(jiǎn)書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公眾號(hào))

推薦文章:
iOS 多線程之GCD
iOS 多線程之NSOperation
iOS 多線程之NSThread
iOS Winding Rules 纏繞規(guī)則
iOS 簽名機(jī)制
iOS 掃描二維碼/條形碼
奇舞周刊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市隙疚,隨后出現(xiàn)的幾起案子壤追,更是在濱河造成了極大的恐慌,老刑警劉巖供屉,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件行冰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡伶丐,警方通過查閱死者的電腦和手機(jī)悼做,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哗魂,“玉大人肛走,你說我怎么就攤上這事÷急穑” “怎么了朽色?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)组题。 經(jīng)常有香客問我葫男,道長(zhǎng),這世上最難降的妖魔是什么往踢? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任腾誉,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘利职。我一直安慰自己趣效,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布猪贪。 她就那樣靜靜地躺著跷敬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪热押。 梳的紋絲不亂的頭發(fā)上西傀,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音桶癣,去河邊找鬼拥褂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牙寞,可吹牛的內(nèi)容都是我干的饺鹃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼间雀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼悔详!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惹挟,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤茄螃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后连锯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體归苍,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年萎庭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霜医。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驳规,死狀恐怖肴敛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吗购,我是刑警寧澤医男,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站捻勉,受9級(jí)特大地震影響镀梭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踱启,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一报账、第九天 我趴在偏房一處隱蔽的房頂上張望研底。 院中可真熱鬧,春花似錦透罢、人聲如沸榜晦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乾胶。三九已至,卻和暖如春朽寞,著一層夾襖步出監(jiān)牢的瞬間识窿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工脑融, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喻频,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓肘迎,卻偏偏與公主長(zhǎng)得像半抱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膜宋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354