一篇文章讀懂TCP ,UDP概念和TCP三次握手連線
OSI 計算機網路7層模型
TCP/IP四層網路模型
傳輸層提供應用間的邏輯通訊(端到端),網路層提供的是主機到主機的通訊,傳輸層提供的是可靠服務。
TCP 中常說的握手指的是:連線的定義和連線的建立的過程。IP 協議是無連線的,但是 TCP 是有連結的。
埠:資料鏈路層依靠 mac 地址定址,網路介面層依靠 ip 地址定址,傳輸層依靠埠號定址,埠就是應用層的各種協議程序和傳輸實體之間進行層間交換的地址。
埠號:標識不同程序的號碼,16位,2的16次方個,只在本地有意義。一共有三類,一是保留埠,比如 ftp 是21,20,dns 是53,http 是80埠,smtp 是25等。二是登記埠,三是客戶端埠號,也叫臨時埠(前兩者叫服務端埠)
套接字:主機 ip+埠號組成,只有通過 ip 地址和埠號,才唯一確定一個連線的埠。唯一的標識了網路裡的某臺主機中的某個應用程序。
udp :
使用者資料報協議,實現的是無連線服務,無確認,不可靠的交付,開銷小,時延短,沒有擁塞控制,主要應用於實時應用,比如 ip 電話,qq,視訊會議等。udp 資料報僅僅是 ip 資料報的一部分。
tcp
也就是傳輸控制協議,實現的是面向連線的服務,向上提供了一條全雙工的可靠的邏輯通道,可靠交付,開銷大,注意,tcp 的連線通道是邏輯 上的,對路由器不可見,類似虛電路。
tcp 連線的三段:
建立,傳送,釋放。連線的端點叫 socket(套接字),被唯一的通訊兩端點確定,採用的是 cs 架構(客戶伺服器模型),tcp 傳輸連線的建立採用的是三次握手(可以防止報文段在傳輸過連線建立中出錯)。
tcp三次握手的最主要目的是保證連線是雙工的,可靠更多的是通過重傳機制來保證的。
第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器 進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入 ESTABLISHED狀態,完成三次握手。
通過這樣的三次握手,客戶端與服務端建立起可靠的雙工的連線,開始傳送資料。
但是為什麼一定要進行三次握手來保證連線是雙工的呢,一次不行麼?兩次不行麼?我們舉一個現實生活中兩個人進行語言溝通的例子來模擬三次握手。
第一次握手:
在考試, a同學 和 b 同學是鐵哥們,此時a 想抄b 的卷子上第一個大題的結果。
a 就向 b 說悄悄話,小 b,我抄一下你的卷子的第一個大題的答案,我算不出來了。此時結果有兩種:
1、假如小 b 專心答題,沒注意 a 的請求,那麼,a 和 b 的溝通建立失敗,也就是說 b 同學接受不到 a 同學傳來的資訊,溝通肯定是失敗了。
2、假如小 b 聽到了 a 的悄悄話,好了,說明第一次對話(握手)成功了。說明 a 同學對 b 同學的請求,b 能接受到。
第二次握手:
小 b 聽到了 a 的請求抄襲的資訊,結果有兩種:
1、假如 b 同學因為緊張,雖然聽到了,但是聽的內容比較模糊,不知道a具體是想抄襲哪道題,於是就索性的隨便敷衍一句:我也不會。此時的a同學一聽立刻生氣了,還能不能做朋友了?算我看錯你了!好的吧,a 和 b 的溝通失敗。說明b 同學無法做出正確應答的情況下溝通失敗。
2、假如b 同學聽到且聽清了a 同學的抄襲請求,於是乎,b 同學會做出正確的應答,並對 a說出了第一個大題的結果,並且ab兄弟情深,b還怕a他抄不上。反問:a,你抄好了麼?那麼等價於第二次握手成功。通過前兩次對話(握手)證明了b同學能聽到且聽清a同學說的話,並能對 a同學的請求,去做出正確的應答。接下來進行第三次握手。
第三次握手:
a 得到了 b 同學的正確的反饋,此時有兩個結果:
1、假如a 同學很高興,馬上開始抄吧!a 就忘乎所以了,抄的飛起,結果沒注意 b 同學的最後那句話『你炒好了麼?』,讓人家小b 同學等回覆等了好幾分鐘。b很失落,心說:好啊你,你抄到了,就忘了我了,得,我再也不管你了,最後ab還是溝通失敗。說明a 同學無法對 b 同學做出應答的情況下,ab溝通失敗。
2、假如a 同學注意到了 b 的反饋和反問,於是 a 同學對 b 同學說:我抄好了。那麼 ab 的第三次握手成功,ab已經建立起了愉快流暢的溝通渠道,接下來a 和 b 就可以繼續愉快的去傳遞答案了。
通過第二次和第三次的握手證明:
a 同學能夠聽到聽清 b 同學的話,並且a 同學對此,能做出正確的反饋。可見,ab進行有效的,愉快的溝通,那麼這三次握手的過程是必須的。
同理對於TCP為什麼需要進行三次握手,可以一樣的理解:
實際上就是為了兩邊的請求都能被識別,所以邏輯上最少三次。為了保證服務端能收接受到客戶端的資訊並能做出正確的應答而進行前兩次(第一次和第二次)握手,為了保證客戶端能夠接收到服務端的資訊並能做出正確的應答而進行後兩次(第二次和第三次)握手。