Linux的傳輸層協議(UDP,TCP)實例講解

傳輸層

負責數據能夠從發送端傳輸接收端

端口號

端口號標識了一個主機上進行通信的不同的應用程序

在TCP/IP協議中,用“源IP”,“源端口號”,“目標IP”,“目標端口號”,“協議號”這樣一個五元組來表示一個通信

(可以通過netstat -n查看)

cat /etc/services

查看知名端口號,我們在寫一個程序使用端口號時,要避開這些知名端口號

一個進程可以綁定多個端口號,但是一個端口號不能被多個進程綁定

netstat

netstat是一個用來查看網絡狀態的重要工具

* -n拒絕顯示別名,能顯示數字的全部轉化成數字

* -l僅列出有Listen(監聽)的服務狀態

* -p顯示簡歷相關連接的程序名

* -t僅顯示TCP相關選項

* -u僅顯示UDP相關選項

* -a顯示所有選項,默認不顯示LISTEN相關

pidof

pidof+進程名

通過進程名,查看進程id

UDP協議

協議端格式

Linux的傳輸層協議(UDP,TCP)實例講解

*十六位UDP長度,表示整個數據報(UDP首部+UDP數據)的最大長度

*如果檢驗和出錯,就會直接丟棄

UDP的特點

UDP傳輸的過程類似於寄信

*無連接:知道對短的IP和端口號就可以直接傳輸,不需要建立連接;

*不可靠:沒有確認機制,沒有重傳機制;如果因為網絡故障該段無法發送給對方,UDP協議層也不會給應用層返回任何錯誤信息;

*面向數據報:不能夠靈活的控制讀寫數據的次數和數量

面向數據報

應用層交給UDP多長的報文,UDP原樣發送,既不會拆分也不會合並;

UDP的緩衝區

*UDP沒有真正意義上的發送緩衝區,調用sendto會直接交給內核,由內核將數據傳給網絡層協議進行後續的傳輸動作;

*UDP具有接收緩衝區,但是這個接收緩衝區不能保證收到的UDP報文的順序和發送UDP報文的順序是一致的,如果緩衝區滿了,再次到達的UDP數據就會被丟棄

UDP的socket既能讀,也能寫,這個概念叫做全雙工

UDP使用注意事項

我們知道UDP協議首部中有一個十六位最大長度,也就是說一個UDP能傳輸的數據最大長度是64K(包含UDP首部),但是64K在當今的互聯網環境下,是一個非常小的數字。

所以就出現了問題。如果我們需要傳輸的數據超過64K,就要在應用層手動的分包,多次發送,並在接收端手動拼裝

基於UDP的應用層協議

*NFS:網絡文件系統

*TFTP:簡單文件傳輸協議

*DHCP:動態主機配置協議

*BOOTP:啟動協議(用於無盤設備啟動)

*DNS:域名解析協議

TCP協議

TCP全稱為傳輸控制協議

Linux的傳輸層協議(UDP,TCP)實例講解

*源/目的端口號:表示數據從哪個進程來,到那個進程去;

*三十二位序號/三十二位確認序號:序列號是進程發送的號碼,確認序號是期望返回的號碼。舉個例子,比如發送序列號為10000,發送五個數據,那麼如果確認序號是10006,就說明數據發送成功,如果不是,就說明了中間有數據沒有發送成功,保證了TCP的可靠性。

*四位TCP包頭長度:表示TCP頭部有多少個32位bit(有多少個四字節);所以TCP頭部最大長度是15*4 = 60

*六位標誌位:URG:緊急指針是否有效

ACK:確認號是否有效

PSH:提示接收端應用程序立刻從TCP緩衝區把數據讀走

RST:對方要求重新建立連接;我們把寫到RST表示的稱為復位報文段

SYN:請求建立連接;我們把攜帶SYN標識的稱為同步報文段;

FIN:通知對方,本段要關閉了,我們稱攜帶FIN標識的為結束報文段

*十六位窗口大小:標誌著TCP緩衝區還剩餘多少,起到一個流量控制的作用

*十六位校驗和:發送端填充,CRC校驗,接收端校驗不通過,則認為數據有問題,此處的檢驗和不光包含TCP首部,也包含TCP數據部分

*十六位緊急指針:標識哪部分數據是緊急數據;


分享到:


相關文章: