傳輸層
傳輸層概念
在學(xué)習(xí)HTTP等應(yīng)用層協(xié)議時,為了便于理解,可以簡單的認(rèn)為HTTP協(xié)議是將請求和響應(yīng)直接發(fā)送到了網(wǎng)絡(luò)當(dāng)中。但實際應(yīng)用層需要先將數(shù)據(jù)交給傳輸層,由傳輸層對數(shù)據(jù)做進(jìn)一步處理后再將數(shù)據(jù)繼續(xù)向下進(jìn)行交付,該過程貫穿整個網(wǎng)絡(luò)協(xié)議棧,最終才能將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)當(dāng)中。
傳輸層負(fù)責(zé)可靠性傳輸,確保數(shù)據(jù)能夠可靠地傳送到目標(biāo)地址。為了方便理解,在學(xué)習(xí)傳輸層協(xié)議時也可以簡單的認(rèn)為傳輸層協(xié)議是將數(shù)據(jù)直接發(fā)送到了網(wǎng)絡(luò)當(dāng)中。
再談端口號
端口號(Port)標(biāo)識一個主機(jī)上進(jìn)行網(wǎng)絡(luò)通信的不同的應(yīng)用程序。當(dāng)主機(jī)從網(wǎng)絡(luò)中獲取到數(shù)據(jù)后,需要自底向上進(jìn)行數(shù)據(jù)的交付,而這個數(shù)據(jù)最終應(yīng)該交給上層的哪個應(yīng)用處理程序,就是由該數(shù)據(jù)當(dāng)中的目的端口號來決定的。
從網(wǎng)絡(luò)中獲取的數(shù)據(jù)在進(jìn)行向上交付時,在傳輸層就會提取出該數(shù)據(jù)對應(yīng)的目的端口號,進(jìn)而確定該數(shù)據(jù)應(yīng)該交付給當(dāng)前主機(jī)上的哪一個服務(wù)進(jìn)程。
因此端口號是屬于傳輸層的概念的,在傳輸層協(xié)議的報頭當(dāng)中就會包含與端口相關(guān)的字段。
在TCP/IP協(xié)議中,用“源IP地址”,“源端口號”,“目的IP地址”,“目的端口號”,“協(xié)議號”這樣一個五元組來標(biāo)識一個通信。
服務(wù)器就是通過“源IP地址”,“源端口號”,“目的IP地址”,“目的端口號”,“協(xié)議號”來識別一個通信的。
- 先提取出數(shù)據(jù)當(dāng)中的目的IP地址和目的端口號,確定該數(shù)據(jù)是發(fā)送給當(dāng)前服務(wù)進(jìn)程的。
- 然后提取出數(shù)據(jù)當(dāng)中的協(xié)議號,為該數(shù)據(jù)提供對應(yīng)類型的服務(wù)。
- 最后提取出數(shù)據(jù)當(dāng)中的源IP地址和源端口號,將其作為響應(yīng)數(shù)據(jù)的目的IP地址和目的端口號,將響應(yīng)結(jié)果發(fā)送給對應(yīng)的客戶端進(jìn)程
通過netstat命令可以查看到這樣的五元組信息。
-n:拒絕顯示別名,能顯示數(shù)字的全部轉(zhuǎn)換成數(shù)字。
-l:僅列出處于LISTEN(監(jiān)聽)狀態(tài)的服務(wù)。
-p:顯示建立相關(guān)鏈接的程序名。
-t(tcp):僅顯示tcp相關(guān)的選項。
-u(udp):僅顯示udp相關(guān)的選項。
-a(all):顯示所有的選項,默認(rèn)不顯示LISTEN相關(guān)。
其中的Local Address表示的就是源IP地址和源端口號,F(xiàn)oreign Address表示的就是目的IP地址和目的端口號,而Proto表示的就是協(xié)議類型。
協(xié)議號和端口號
協(xié)議號是存在于IP報頭當(dāng)中的,其長度是8位。協(xié)議號指明了數(shù)據(jù)報所攜帶的數(shù)據(jù)是使用的何種協(xié)議,以便讓目的主機(jī)的IP層知道應(yīng)該將該數(shù)據(jù)交付給傳輸層的哪個協(xié)議進(jìn)行處理。
端口號是存在于UDP和TCP報頭當(dāng)中的,其長度是16位。端口號的作用是唯一標(biāo)識一臺主機(jī)上的某個進(jìn)程。
端口號區(qū)域
端口號的長度是16位,因此端口號的范圍是0 ~ 65535:
0 ~ 1023:知名端口號。比如HTTP,F(xiàn)TP,SSH等這些廣為使用的應(yīng)用層協(xié)議,它們的端口號都是固定的。
1024 ~ 65535:操作系統(tǒng)動態(tài)分配的端口號??蛻舳顺绦虻亩丝谔柧褪怯刹僮飨到y(tǒng)從這個范圍分配的。
常見端口號
有些服務(wù)器是非常常用的,這些服務(wù)器的端口號一般都是固定的:
- ssh服務(wù)器,使用22端口。
- ftp服務(wù)器,使用21端口。
- telnet服務(wù)器,使用23端口。
- http服務(wù)器,使用80端口。
- https服務(wù)器,使用443端口。
我們可以查看/etc/services文件,該文件是記錄網(wǎng)絡(luò)服務(wù)名和它們對應(yīng)使用的端口號及協(xié)議。
pidof
pidof命令可以通過進(jìn)程名,查看進(jìn)程id。
pidof命令可以配合kill命令快速殺死一個進(jìn)程。
UDP
UDP (User Datagram Protocol) 是在 OSI 七層模型中的傳輸層上的一種協(xié)議。它和 TCP 類似是用來傳輸數(shù)據(jù)的,但是 UDP 更加簡單、高效、靈活,適用于對數(shù)據(jù)傳輸速度要求較高,但對可靠性要求不高的場景,例如游戲、音頻、視頻等實時通訊場景。
網(wǎng)絡(luò)套接字編程時用到的各種接口,是位于應(yīng)用層和傳輸層之間的一層系統(tǒng)調(diào)用接口,這些接口是系統(tǒng)提供的,我們可以通過這些接口搭建上層應(yīng)用,比如HTTP。我們經(jīng)常說HTTP是基于TCP的,實際就是因為HTTP在TCP套接字編程上搭建的。
而socket接口往下的傳輸層實際就是由操作系統(tǒng)管理的,因此UDP是屬于內(nèi)核當(dāng)中的,是操作系統(tǒng)本身協(xié)議棧自帶的,其代碼不是由上層用戶編寫的,UDP的所有功能都是由操作系統(tǒng)完成,因此網(wǎng)絡(luò)也是操作系統(tǒng)的一部分。
UDP協(xié)議格式
- 16位源端口號:表示數(shù)據(jù)從哪里來。
- 16位目的端口號:表示數(shù)據(jù)要到哪里去。
- 16位UDP長度:表示整個數(shù)據(jù)報(UDP首部+UDP數(shù)據(jù))的長度。
- 16位UDP檢驗和:如果UDP報文的檢驗和出錯,就會直接將報文丟棄。
我們在應(yīng)用層看到的端口號大部分都是16位的,其根本原因就是因為傳輸層協(xié)議當(dāng)中的端口號就是16位的。
我們在學(xué)習(xí)協(xié)議的時候通常要弄清楚兩個問題
問題1:UDP如何將報頭和有效載荷進(jìn)行分離?
UDP的報頭當(dāng)中只包含四個字段,每個字段的長度都是16位,總共8字節(jié)。因此UDP采用的實際上是一種定長報頭,UDP在讀取報文時讀取完前8個字節(jié)后剩下的就都是有效載荷了。
問題2:UDP如何決定將有效載荷交付給上層的哪一個協(xié)議?
UDP上層也有很多應(yīng)用層協(xié)議,因此UDP必須想辦法將有效載荷交給對應(yīng)的上層協(xié)議,也就是交給應(yīng)用層對應(yīng)的進(jìn)程。
應(yīng)用層的每一個網(wǎng)絡(luò)進(jìn)程都會綁定一個端口號,服務(wù)端進(jìn)程必須顯示綁定一個端口號,客戶端進(jìn)程則是由系統(tǒng)動態(tài)綁定的一個端口號。UDP就是通過報頭當(dāng)中的目的端口號來找到對應(yīng)的應(yīng)用層進(jìn)程的。
報頭的數(shù)據(jù)結(jié)構(gòu)其實就是結(jié)構(gòu)體
UDP數(shù)據(jù)封裝:
當(dāng)應(yīng)用層將數(shù)據(jù)交給傳輸層后,在傳輸層就會創(chuàng)建一個UDP報頭類型的變量,然后填充報頭當(dāng)中的各個字段,此時就得到了一個UDP報頭。
此時操作系統(tǒng)再在內(nèi)核當(dāng)中開辟一塊空間,將UDP報頭和有效載荷拷貝到一起,此時就形成了UDP報文。
UDP協(xié)議的特點
UDP傳輸?shù)倪^程就類似于寄信,其特點如下:
- 無連接:知道對端的IP和端口號就直接進(jìn)行數(shù)據(jù)傳輸,不需要建立連接。
- 不可靠:沒有確認(rèn)機(jī)制,沒有重傳機(jī)制;如果因為網(wǎng)絡(luò)故障該段無法發(fā)到對方,UDP協(xié)議層也不會給應(yīng)用層返回任何錯誤信息。
- 面向數(shù)據(jù)報:不能夠靈活的控制讀寫數(shù)據(jù)的次數(shù)和數(shù)量。
- 無序性:UDP 協(xié)議是無序的,發(fā)送的數(shù)據(jù)可能會經(jīng)過不同的路徑到達(dá)目標(biāo)地址,因此接收方可能無法按照發(fā)送順序?qū)?shù)據(jù)進(jìn)行組裝。
面向數(shù)據(jù)報:應(yīng)用層交給UDP多長的報文,UDP就原樣發(fā)送,既不會拆分,也不會合并,這就叫做面向數(shù)據(jù)報。
UDP的緩沖區(qū)
- UDP沒有真正意義上的發(fā)送緩沖區(qū)。調(diào)用sendto會直接交給內(nèi)核,由內(nèi)核將數(shù)據(jù)傳給網(wǎng)絡(luò)層協(xié)議進(jìn)行后續(xù)的傳輸動作。
- UDP具有接收緩沖區(qū)。但是這個接收緩沖區(qū)不能保證收到的UDP報的順序和發(fā)送UDP報的順序一致;如果緩沖區(qū)滿了,再到達(dá)的UDP數(shù)據(jù)就會被丟棄。
- UDP的socket既能讀,也能寫,因此UDP是全雙工的。
接收緩沖區(qū)的作用
如果UDP沒有接收緩沖區(qū),那么就要求上層及時將UDP獲取到的報文讀取上去,如果一個報文在UDP沒有被讀取,那么此時UDP從底層獲取上來的報文數(shù)據(jù)就會被迫丟棄。
一個報文從一臺主機(jī)傳輸?shù)搅硪慌_主機(jī),在傳輸過程中會消耗主機(jī)資源和網(wǎng)絡(luò)資源。如果UDP收到一個報文后僅僅因為上次收到的報文沒有被上層讀取,而被迫丟棄一個可能并沒有錯誤的報文,這就是在浪費主機(jī)資源和網(wǎng)絡(luò)資源。
因此UDP本身是會維護(hù)一個接收緩沖區(qū)的,當(dāng)有新的UDP報文到來時就會把這個報文放到接收緩沖區(qū)當(dāng)中,此時上層在讀數(shù)據(jù)的時就直接從這個接收緩沖區(qū)當(dāng)中進(jìn)行讀取就行了,而如果UDP接收緩沖區(qū)當(dāng)中沒有數(shù)據(jù)那上層在讀取時就會被阻塞。因此UDP的接收緩沖區(qū)的作用就是,將接收到的報文暫時的保存起來,供上層讀取。
UDP傳輸數(shù)據(jù)注意事項
需要注意的是,UDP協(xié)議報頭當(dāng)中的UDP最大長度是16位的,因此一個UDP報文的最大長度是64K(包含UDP報頭的大?。?。文章來源:http://www.zghlxwxcb.cn/news/detail-738539.html
然而64K在當(dāng)今的互聯(lián)網(wǎng)環(huán)境下,是一個非常小的數(shù)字。如果需要傳輸?shù)臄?shù)據(jù)超過64K,就需要在應(yīng)用層進(jìn)行手動分包,多次發(fā)送,并在接收端進(jìn)行手動拼裝。文章來源地址http://www.zghlxwxcb.cn/news/detail-738539.html
到了這里,關(guān)于【計算機(jī)網(wǎng)絡(luò) 】傳輸層——UDP的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!