接下來,總結傳輸層的兩大協議UDP和TCP。服務器
一.UDP(用戶數據報協議)網絡
講UDP之間,先了解兩個概念:有鏈接和無鏈接。spa
有鏈接:通訊以前,通訊雙方必須創建一條通道;3d
無鏈接:不須要創建通道,發送方只管發,接收方收不收穫得不關心。指針
而UDP叫作無鏈接、不可靠的運輸協議。除了提供進程到進程(而不是主機到主機)的通訊以外,就沒給IP服務添加任何東西。此外,它還完成很是有限的差錯檢驗。說完它的缺點,那它的優勢呢?UDP是個很是簡單的協議,只有最小的開銷。不考慮可靠性,發送的消息又很短時,就能夠用UDP!blog
這裏又提到兩個概念:進程到進程的通訊,主機到主機的通訊進程
進程到進程的通訊:IP協議將報文交付給目的計算機,這是一種不完整的交付。這個報文必須交到正確的進程。這就是UDP乾的。
同步
完成進程到進程的通訊有好幾種方法,最經常使用的就是經過客戶--服務器範例(C/S)。互聯網
在互聯網中,主機是用IP來定義本身,而進程就須要用端口號來定義本身:熟知端口(0~1023);註冊端口(1024~49151);動態端口(49152~65535)。常見的幾個熟知端口7-->echo(把收到的數據回送到發送端);13-->daytime(返回日期和時間);69-->TFTP(簡單文件傳送協議)。方法
套接字:網絡IP加端口號。
UDP有8個字節的固定首部,格式以下:
差錯控制:當接收端使用檢驗和並檢測出差錯時,就悄悄的將這個用戶數據報丟掉。
二.TCP(傳輸控制協議)
像UDP同樣,TCP也是進程到進程的協議。所以,也使用端口號。與UDP不一樣的是,TCP是面向連接的協議,兩個TCP之間創建一條虛鏈接(不是物理鏈接)也是可靠的。此外,TCP在運輸層使用流量控制和差錯控制機制。格式以下:
控制位:
URG-->緊急指針字段值有效
ACK-->確認字段值有效
PSH-->推送數據
RST-->鏈接必須復位
SYN-->在鏈接創建時必須對序號進行同步
FIN-->終止鏈接
窗口值:這個字段定義對方必須維持的窗口值。注意到這個字段是16位長,所以窗口值的最大長度是65535字節。
接下來,看看TCP在整個通訊過程當中的時序:
從上圖中咱們清楚的看出,在鏈接開始階段,客戶端發送了個一個SYN報文段,報文段中只有SYN標誌位被置爲1,用來同步序號,消耗一個序號。接下來服務器發送了一個SYN+ACK的報文段,同步本身的初始序號,以便向客戶端發送字節。同時發出一個ACK確認報文,表面確認收到來自客戶端的SYN報文,並指望客戶端繼續發送下一個序號。SYN+ACK,不攜帶數據,消耗一個序號。ACK若是不攜帶數據,就不消耗序號。
再來看鏈接關閉階段的四次握手:從客戶端到服務器的收據傳送結束了,給服務器發送一個FIN報文段,鏈接進入半關閉,客戶端進入FIN_WAIT狀態。這時服務器仍然能夠發送數據。當服務器已經把全部處理過的數據都處理完畢後,就發送一個FIN報文段,而且被客戶發來的ACK予以確認。
TIME_WAIT:
收到第二個FIN,已發送ACK;等帶2MSL超時。但是咱們爲何要2MSL的時間進行TIME_WAIT呢?兩個理由:1.若是最後一個ACK報文段丟失了,那麼服務器TCP覺得它的FIN丟失了,若是客戶端進入CLOSED狀態,並在2MSL計時器超時就關閉了這條鏈接,那麼客戶端永遠收不到FIN,服務器也就永遠收到關閉的ACK。2.前一個鏈接中的重複報文有可能到達新的鏈接中,被解釋爲屬於新鏈接的報文段,爲了不這個問題,就設置爲了2MSL的等待時間。