1. 程式人生 > >淺談"網路傳輸層"

淺談"網路傳輸層"

應用層
一個應用層協議都是為了解決某一類應用問題,而問題的解決又必須通過位於不同主機中的多個應用程序之間的通訊和協同工作來完成的。
應用層負責的內容:
(1)應用程序交換的報文型別,如請求報文和相應報文
(2)各種報文型別的語法,如報文中的各個欄位以及詳細描述
(3)欄位的語義,即包含在欄位中的資訊含義
(4)程序何時,如何傳送報文,以及對報文相應的規則
兩個重要的概念:序列化與反序列化
序列化是指將結構化的資料變為可以用來發送的字串風格的資料
反序列化是指把從網路中拿出來的訊息轉化成結構化的資料
序列化與反序列化用的外掛:XML,Jison
HTTP協議
常用的HTTP協議:HTTP(超文字傳輸協議),FTD,DNS,SSH
平時我們所說的網址就叫做URL,如下是一個URL的基本資訊
這裡寫圖片描述


HTTP協議格式
HTTP請求:
總共分為四個部分:首行:[方法]+[url]+[版本]
Header:請求的屬性,冒號分割符的鍵值對,每組屬性之間使用\n分割,遇到空行標識Header部分結束,
Body:空行後面的內容都是Body,Body允許為空字串,如果Body存在,則在Header中會有一個Content-Length屬性來標識Body的長度
HTTP相應:
首行:[版本號]+[狀態碼]+[狀態碼解釋]
Header:請求的屬性,冒號分割的鍵值對;每組屬性之間使用\n分割,
Body:空行後面的內容都是Body,Body允許為空字串,如果Body存在,則在Header中會有一個Content-Length屬性來標識Body的長度,如果伺服器返回了一個html頁面內容就在Body中。
HTTP常用的方法有兩種:分別是GET和POST
HTTP的狀態碼
這裡寫圖片描述

重定向分為臨時重定向和永久重定向
臨時重定向:第一次請求時要進行跳轉
永久重定向:第二次請求時直接跳轉到需要訪問的地方
最常見的狀態碼:200(OK),404(Not Found),403(Forbidden),302(Redirect,重定向),504(Bad Gateway)
傳輸層
在TCP/IP協議中,用”源IP”,”目的IP”,”源埠號”,”目的埠號”和“協議號”這樣的五元組來標識一個通訊,這裡的協議號標識使用的是傳輸層的哪個協議
埠號的劃分範圍:
0-1023:知名埠號
1024-15535:作業系統動態分配的埠號,客戶端程式的埠號,就是由作業系統從這個範圍分配的
常見的一些知名埠號:
ssh伺服器:22號埠號
ftp伺服器:21號埠號
telnet伺服器:23號埠號
http伺服器:80號埠號
https伺服器:443號埠號

檢視知名埠號:cat /etc/services
netstat -n  //拒絕顯示別名,能顯示成數字的全部轉化成數字
netstat -l  //僅列出有在監聽的服務狀態
netstat -p  //顯示建立相關連線的程式名
netstat -t  //僅顯示tcp相關選項
netstat -u  //僅顯示udp相關選項
netstat -a  //顯示所有選項,預設不顯示listen相關
pidof [程序名]  //通過程序名檢視程序ID

認識UDP
UDP是無連線的,,即在傳送之前不需要建立連線,當然傳送結束時也不需要釋放連線,因此減少了開銷和傳送資料之前的時延。
UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的連線狀態表
UDP是面向報文的,UDP對應用層交下來的報文既不合並,也不拆分,而是保留這些報文的邊界,即一次傳送一個報文,UDP原樣傳送,既不會拆分,也不會分離
UDP沒有擁塞控制,因此網路出現的擁塞不會使源主機的傳送速率降低
UDP支援一對一,一對多,多對一,多對多的互動通訊
UDP的首部開銷小,只有八個位元組,比TCP的20個位元組的首部要短
UDP的首部格式:
使用者資料報UDP有兩個欄位,資料欄位和首部欄位
首部欄位由四個欄位組成:
源埠:在需要對方回信時選用,不需要時可用全0
目的埠:在終點交付報文時必須要使用到
長度:UDP使用者資料報的長度,其最小值是8(僅有首部)
檢驗和:檢驗UDP使用者資料報在傳輸中是否有錯,有錯就丟棄
UDP報文段的首部格式:
這裡寫圖片描述
當運輸層從IP層收到UDP的資料報時,就根據UDP首部中的目的,把UDP資料報根據相應的埠上交最後的終點
使用定長報頭,可以進行報頭與有效載荷的分離
UDP的緩衝區
UDP沒有真正意義上的傳送緩衝區,呼叫sendto會直接交給核心,由核心將資料交給網路層協議進行後續的傳輸動作
UDP具有接受緩衝區,但這個接受緩衝區不能保證收到的UDP報的順序和傳送UDP報的順序一致,如果緩衝區滿了,再到達的UDP資料就會被丟棄。
傳送的資料超過了UDP的最大長度,就要在應用層手動進行分包,多次傳送,並在接收端手動拼裝
UDP的socket既能讀,也能寫,全雙工
基於UDP的應用層協議
NFS:網路檔案系統
TFTP:簡單檔案傳輸協議
DHCP:動態主機配置協議
BOOTP:啟動協議
DNS:域名解析協議
認識TCP
TCP是TCP/IP體系中非常複雜的一個協議
TCP的主要特點:
TCP是面向連線的傳輸層協議,應用程式在使用TCP之前,必須先建立TCP連線,在資料傳送完畢後需要釋放已經建立的TCP連線
每一條TCP連線只能有兩個端點,每一條TCP連線只能是點對點的
TCP提供可靠傳輸,,通過TCP連線傳送的資料,無差錯,不丟失,不重複,並且按序到達
TCP提供全雙工通訊,TCP允許傳送雙方的應用程序在任何時候都可以傳送資料,TCP的兩端都設有傳送緩衝區和接受緩衝區,用來臨時存放接收到的資料,彼此將資料傳送到緩衝區之後,就可以做自己的事情了。
面向位元組流,TC任意位元組P的傳送方可以以任意位元組傳送資料,接受方可以以任意位元組拿走收據
UDP報文段的首部格式
這裡寫圖片描述
源埠號和目的埠號:各佔兩個位元組,分別寫入源埠號和目的埠號
序號:佔4個位元組,值的是本報文段的資料的第一個位元組的序號
確認號:佔四個位元組,是期望收到對方下一個報文段的第一個資料位元組的序號,確認號為N,表明N-1為止的所有資料都已經正確接受
資料偏移:佔4位,它指出TCP報文段的資料起始處距離TCP報文段的起始處有多遠,資料偏移的最大值是60位元組,這也是TCP首部的最大長度,(選項的長度不能超過40位元組)
保留:佔6位,保留為今後使用,目前應該置為0
緊急URG:當URG=1時,表明緊急指標欄位有效,它告訴系統,報文段中有緊急資料應該儘快傳送,而不要按照原來的順序傳送
確認ACK:當ACK=1時,確認訊號欄位才有效,當ACK=0時,確認訊號欄位無效
推送PSH:傳送方TCP將PSH置為1,對方就可以立即收到資料
復位RST:當RST=1時,表明TCP連接出現差錯,必須釋放連線
同步SYN:當SYN=1,ACK=0時,表明這是一個連線請求報文段,若對方同意連線,就將ACK置為1
終止FIN:用來釋放連線,當FIN=1時,表明資料傳送完畢,要求釋放連線
視窗:佔兩個位元組,視窗是指傳送本報文段一方的接受視窗,而不是自己的傳送視窗,視窗值告訴對方從本報文段的首部算起,接收方目前允許傳送的資料量
檢驗和:佔兩個位元組,包括資料和首部兩部分
緊急指標:佔兩個位元組,緊急指標指出了緊急資料的末尾在報文段中的位置
選項:長度可變,最長40個位元組,當沒有使用選項時,TCP首部長度是20位元組。