server(指的服務器端) ,client(指的是客戶端)算法
1、 傳輸層做用緩存
傳輸層的做用其實就是實現,兩臺在主機中應用程序之間的通訊。(被稱之爲邏輯通訊)服務器
傳輸層協議網絡
TCP(傳輸控制協議)數據結構
MSL :一個傳輸報文,在網絡上最大的生存時間 ,和咱們的ttl概念有點相似。不過msl是指的時間,而後ttl是指一個數據包,在整個網絡中轉發,最多能夠通過多少臺路由器。tcp
1、tcp報文數據結構優化
首先tcp報文,和ip數據包是同樣的,也分爲首部和數據部分,下圖就是tcp報文的首部spa
根據上述圖中,tcp報文的首部長度也是有20個字節,一共有5層,每一層4個字節,源端口和目的端口就是兩個須要通訊進程對應的端口號,很少說3d
序號(seq):若是是在創建鏈接的過程,這個初始序列號是發送端隨機產生的一個數字。指針
確認號(ack):指定的是下一個指望接收的字節
數據偏移:整個tcp報文,從哪一位開始是數據部分,而不是tcp首部。
保留:用於之後的擴展
接下來每一個8個1bit的標誌位:這8個標誌位是成對使用的
cwr和ece 用來處理擁塞控制 。
syn 和ack ,syn用來創建鏈接的 ,ACK標識,確認位(ack)是有效的。用來標識這是一個確認報
urg 和psh 是用來表示數據包傳輸和接收優先的,urg是發送端優先 ,psh是接收端優先接收。
rst 和 fin ,rst是用來處理重置一個鏈接,fin表示釋放一個鏈接。
窗口 :用來處理流量控制的,應用了滑動窗口技術,這個會在tcp特性中講解。
檢驗和 :就是用來檢測整個數據包的
緊急指針:和urg標誌位共用,一旦urg是1,緊急指針是用來標識整個tcp報文從哪一個字節開始是優先處理部分。
2、特性:面向鏈接 、 可靠傳輸 、 流量控制,擁塞控制 、 面向字節流
首先解釋一下什麼是可靠傳輸:
RTT(Round Trip Time):一個鏈接的往返時間,即數據發送時刻到接收到確認的時刻的差值;
tcp協議的可靠傳輸是指,中止等待協議,簡單來理解就是send一個tcp報文,必需要等待一個receive返回一個確認信息。若是沒有收到,就中止等待,
中止等待的時間就是rtt,若是過了這個時間尚未收到確認信息,就再發送一次以前的報文。可是因爲這種協議效率過低了,基於這種原理,就是出現了
流水線發送和累計確認
流水線發送:
累積確認:就是發送方一次發送多個數據包,接收方,根據已經接收到的,統一給一個確認
面向鏈接:注意我說的是鏈接(不是三次握手,四次斷開),首先咱們應該思考一下爲何要創建鏈接,由於tcp通常是交付應用層較大的文件,因此,是多要多個
tcp數據報文(或者稱之爲分組或者段),這個時候,咱們都用這一個鏈接,將一個大的文件,實現一個完整的交付。假如說沒有這個鏈接,咱們發送端要給接收端一個大的文件
,這個中間的傳輸過程,可能就會走不少不一樣的鏈路,可能,是這個文件最後的尾部先到了,首部丟失了,這樣就會致使傳輸很混亂,因此創建了一個鏈接保證一個穩定的傳輸。下降丟包的機率
接下來,咱們爲了創建這個鏈接就須要到了三次握手,四次揮手了,重點來了!!!
第一個爲何要三次握手才能創建一個鏈接,是由於防止出現殭屍鏈接。若是隻須要一次請求,一次確認,就能夠創建一個鏈接。會出現這樣一個狀況,第一次發送的狀況,走的鏈路發了阻塞,超過了rtt時間,
這個時候,發送端在發送一個請求,接收端接收,發送一個確認。鏈接創建,穿了一些數據,最後鏈接釋放了。這個時候第一次發送的請求到了接收端,接收端是沒法判斷這個是第一次請求的,就會直接給一個確認,就創建了
一個新的鏈接。而這個鏈接,就消耗了資源。一旦這樣的鏈接多了,會致使主機崩潰。
三次握手的詳細過程
a: 發送端發送一個請求,tcp報文中標誌位,SYN=1,ack=0 ,seq是一個隨機數字.,假如是x
b:接收端收到一個請求返回一個確認 ,tcp報文中, SYN=1 ,ack=x+1 ,ACK=1 ,seq=y
c:發送端接收到這個確認,在發送一個確認給接收端 ,tcp報文中是ACK=1 , ack=y+1 ,seq=x+1
上述一個鏈接創建的過程
數據傳輸完成以後,就涉及到鏈接的釋放,也就是傳說中的四次揮手 ,首先解釋一下爲何會有四次揮手。 由於tcp是全雙工通訊,這就至關於一對
單工通訊。因此當client主動發起釋放鏈接,告訴server,我這邊沒有數據發送了,關閉client向server端發送數據的通道。這個時候,頗有可能,server端
正在給client發送數據,若是這個時候,client直接斷開了,client就接收不到這段數據了,就好像,打電話,A給B打電話,A把想說的話說完了,直接掛斷了,B
還有想要回應的話,這個時候,B沒有說完,A直接掛斷了。而正常的通訊方式是,A說完了,A說我講完了須要掛斷 , B說先別掛斷,等一下,我還優化要說。等B
說完 , 告訴A,我講完了,我也要掛斷了。A說能夠。而後B掛斷。隨後A等到通道忙音後,就掛斷了。
四次揮手詳細過程
A:發起用釋放鏈接的請求,FIN=1 ,SEQ =U .
B:給一個確認,ack=u+1 ,ACK=1 ,seq =v
B:發送一個請求釋放個人鏈接,fin=1 ack =u+1 ,seq =w ,ack=1
A:給一個確認 ,ACK=1 ,ack=w+1 ,seq = u+1
咱們看到在鏈接創建和釋放的過程當中,這個鏈接都是有狀態的,下面詳細解讀一下這個狀態。
CLOSED: 鏈接處於關閉狀態
LISTEN:服務器端處理處於監聽狀態,監聽tcp鏈接請求
SYN RECD : 服務器端接到一個鏈接請求 ,並返回給client一個確認,等待client發來一個確認鏈接
SYN SEND : 客戶端主動發起一個鏈接,等待服務器端匹配鏈接,返回確認
EStablished :鏈接已經創建 ,處理傳輸數據的狀態
FIN WAIT1 : 主動釋放鏈接一端,已經沒有數據要發了,請求釋放鏈接
FIN WAIT2 :另外一端贊成釋放鏈接
TIME WAIT :等待2msl時間等待 ,發送一個鏈接斷開的確認信息
Close WAIT :接收一個關閉鏈接的請求,並請求本地應用,等待本地發起的關閉鏈接請求
LAST ACK :等待關閉鏈接的確認
滑動窗口技術:用來處理流量控制:
窗口的大小是可變的
緩存中有存在窗口,來處理,發送的數據或者接收的數據,是以字節爲單位的。窗口控制能夠發送數據的大小,窗口經過移動,控制發送數據的範圍。
擁塞控制:
這個擁塞控制就是tcp有一個擁塞窗口,用來分析鏈路上,信信道是否阻塞,若是不是阻塞的就多發點包,
若是是阻塞的就根據算法,少發包。
面向字節流的:
就是tcp通常是交付大文件的,一個文件將會有不少個字節,一個tcp報文是傳輸不完的,因此每個tcp傳輸報文其實是文件中一部分字節,
因此說是面向字節流的。
UDP :無鏈接 、 不可靠傳輸、udp面向是文件
簡答來理解 ,無鏈接就是udp報文能夠在任何一個鏈路上傳輸tcp報文
不可靠傳輸是指,udp包發送沒有確認,若是丟失,,客戶端會從新發請求。服務器端在來發送udp包。
一個udp報就能處理頂層整個文件,不處理大型的文件。