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協議

協議端格式

這裏寫圖片描述

*十六位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全稱爲傳輸控制協議
這裏寫圖片描述

*源/目的端口號:表示數據從哪個進程來,到那個進程去;
*三十二位序號/三十二位確認序號:序列號是進程發送的號碼,確認序號是期望返回的號碼。舉個例子,比如發送序列號爲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數據部分
*十六位緊急指針:標識哪部分數據是緊急數據;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章