目錄
- 前言
- UDP協(xié)議概述
- 套接字
- 多路復(fù)用
- 多路分解
- UDP數(shù)據(jù)包格式
- UDP校驗(yàn)和的計(jì)算
- UDP工作流程
- 標(biāo)準(zhǔn)UDP端口
前言
參照清華大學(xué)出版社-羅軍周主編的《TCP/IP協(xié)議及網(wǎng)絡(luò)編程技術(shù)》進(jìn)行學(xué)習(xí)。
本篇主要參考第八章:《UDP協(xié)議》
UDP協(xié)議概述
-
傳輸層協(xié)議
- 位于應(yīng)用層之下蛔添、為不同設(shè)備上的應(yīng)用提供邏輯通訊的功能蹦魔。進(jìn)程之間使用該邏輯彼此發(fā)送報(bào)文之众、而不需要考慮物理層的差異屁倔。
- 網(wǎng)絡(luò)層只負(fù)責(zé)主機(jī)與主機(jī)之間的傳輸、而傳輸層則將網(wǎng)絡(luò)層(IP協(xié)議)接收/發(fā)送的數(shù)據(jù)贝淤、正確定向到相應(yīng)的應(yīng)用層艳丛。
UDP協(xié)議為應(yīng)用程序提供不可靠的無連接的服務(wù)。
即UDP協(xié)議數(shù)據(jù)包可能會(huì)出現(xiàn)丟包涝登、失序等雄家、且不處理重發(fā)。這一點(diǎn)和IP協(xié)議一樣胀滚、所以需要使用UDP協(xié)議的程序自己處理重發(fā)趟济、順序重組等。
但這種模式相比可靠的傳輸服務(wù)咽笼、效率更高顷编、沒有擁塞控制、首部更簡(jiǎn)潔剑刑、對(duì)應(yīng)用負(fù)擔(dān)也更小媳纬。
- 常見的應(yīng)用
流式多媒體、DNS等施掏。
套接字
從網(wǎng)絡(luò)向某進(jìn)程傳遞數(shù)據(jù)钮惠、或者從進(jìn)程向網(wǎng)絡(luò)傳遞數(shù)據(jù)的門戶。
傳輸層和應(yīng)用進(jìn)程通過套接字來傳遞數(shù)據(jù)七芭。
主機(jī)上的套接字可以有很多個(gè)素挽、每個(gè)套接字都有唯一的標(biāo)識(shí)符。
應(yīng)用層通過傳輸層進(jìn)行數(shù)據(jù)通信時(shí)抖苦、傳輸層會(huì)遇到同時(shí)為多個(gè)應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題毁菱。
多個(gè)TCP連接或多個(gè)應(yīng)用程序進(jìn)程可能需要 通過同一個(gè)TCP協(xié)議端口傳輸數(shù)據(jù)米死。
為了區(qū)別不同的應(yīng)用程序進(jìn)程和連接、許多計(jì)算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了稱為套接字 (Socket)的接口贮庞、區(qū)分不同應(yīng)用程序進(jìn)程間的網(wǎng)絡(luò)通信和連接峦筒。
主要有3個(gè)參數(shù):
- 通信的目的IP地址
- 使用的傳輸 層協(xié)議(TCP或UDP)
- 使用的端口號(hào)(像房間號(hào)一樣對(duì)應(yīng)到每一個(gè)程序)。
Socket原意是“插座”窗慎。通過將這3個(gè)參數(shù)結(jié)合起來物喷,與一個(gè)“插座”Socket綁定,應(yīng)用層就可以和傳輸 層通過套接字接口遮斥,區(qū)分來自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信峦失,實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。
工作原理
報(bào)文到達(dá)目標(biāo)主機(jī)時(shí)术吗、傳輸層會(huì)檢查報(bào)文中的目的端口號(hào)尉辑、并且發(fā)送到相應(yīng)含有套接字的軟件中。報(bào)文端的數(shù)據(jù)將通過套接字進(jìn)入到應(yīng)用層對(duì)應(yīng)的進(jìn)程较屿。
一個(gè)簡(jiǎn)單的例子:
百度在同一個(gè)IP地址(域名)下隧魄、可能有多種應(yīng)用。比如APP(
baidu:80
)隘蝎、百度貼吧(baidu:81
)购啄、百度金融(baidu:82
)。80嘱么、81狮含、82代表端口號(hào)。
這個(gè)時(shí)候曼振、我想要訪問百度金融几迄。就需要將對(duì)應(yīng)的套接字(端口號(hào)為82)交給百度的主網(wǎng)、再由其根據(jù)百度金融的端口號(hào)冰评、交給百度金融的應(yīng)用服務(wù)器(監(jiān)聽這baidu:82
)乓旗。
多路復(fù)用
針對(duì)發(fā)送主機(jī)
離散狀態(tài)信息的匯聚
同時(shí)給多目標(biāo)發(fā)送數(shù)據(jù)。不同的進(jìn)程有不同的套接字集索、從不同的軟件中收集數(shù)據(jù)、再給每一個(gè)數(shù)據(jù)塊加上頭部汇跨、生成報(bào)文交給網(wǎng)絡(luò)層發(fā)送务荆。
多路分解
針對(duì)接收主機(jī)
匯聚狀態(tài)信息的拆分
同時(shí)接收到多來源發(fā)送的數(shù)據(jù)。將報(bào)文段中的數(shù)據(jù)交付到正確的套接字(將報(bào)文定向到正確的進(jìn)程)穷遂。
UDP數(shù)據(jù)包格式
每行4字節(jié)函匕、每個(gè)字節(jié)8位。
源端口
可選目的端口
目標(biāo)主機(jī)端口UDP包長(zhǎng)
整個(gè)UDP包長(zhǎng)度蚪黑、包括頭部和數(shù)據(jù)盅惜。
最小值為8(不包含數(shù)據(jù)的情況下其余共4*2字節(jié))中剩。IP數(shù)據(jù)包為20字節(jié)
UDP校驗(yàn)和
可選
UDP校驗(yàn)和的計(jì)算
UDP校驗(yàn)和的計(jì)算不僅包括數(shù)據(jù)包中所有的數(shù)據(jù)、還包含一個(gè)成為偽頭部
的結(jié)構(gòu)和抒寂、會(huì)用通過補(bǔ)0的方式來將UDP數(shù)據(jù)包補(bǔ)足16位的整數(shù)倍结啼。
計(jì)算校驗(yàn)和時(shí)、UDP協(xié)議會(huì)先構(gòu)造該數(shù)據(jù)包的偽頭部結(jié)構(gòu)屈芜、然后將UDP數(shù)據(jù)包的校驗(yàn)和字段設(shè)置為0郊愧、并將其追加到偽頭部末尾。
UDP偽頭部格式
UDP的協(xié)議代碼為17
UDP偽頭部的意義
包含了源端口和目的端口
原始的UDP數(shù)據(jù)包中沒有包含源IP地址和目的IP地址井佑、以便讓數(shù)據(jù)包的接收者確定數(shù)據(jù)包是來自正確的源地址以及確實(shí)是發(fā)送給目的主機(jī)属铁。
UDP工作流程
- 接收方主機(jī)
程序A
需要申請(qǐng)一個(gè)UDP端口號(hào)、例如P
躬翁。 - 發(fā)送方主機(jī)
應(yīng)用程序準(zhǔn)備好數(shù)據(jù)后焦蘑、會(huì)交給UDP協(xié)議進(jìn)行數(shù)據(jù)封裝、目標(biāo)端口號(hào)
字段置位P
后交給IP協(xié)議在此封裝發(fā)送盒发。 - 接收方主機(jī)
IP協(xié)議發(fā)現(xiàn)協(xié)議字段為17
例嘱、就將IP數(shù)據(jù)包的數(shù)據(jù)區(qū)交給UDP協(xié)議處理。UDP協(xié)議發(fā)現(xiàn)端口號(hào)為P
迹辐、就將UDP數(shù)據(jù)包的數(shù)據(jù)區(qū)放置在端口P的隊(duì)列中蝶防。程序A
從該隊(duì)列中將數(shù)據(jù)依次取出進(jìn)行處理。
標(biāo)準(zhǔn)UDP端口
一個(gè)應(yīng)用程序如何才能知道該將數(shù)據(jù)發(fā)往那個(gè)目標(biāo)端口?
- 可以雙方提前約定
- 可以根據(jù)不同業(yè)務(wù)類型使用標(biāo)準(zhǔn)端口(比如http就是80)