一、傳輸層與傳輸層協(xié)議 二、用戶數(shù)據(jù)報(bào)協(xié)議(UDP)
三、傳輸控制協(xié)議TCP
四、TCP協(xié)議滑動(dòng)窗口
傳輸層中實(shí)現(xiàn)傳輸層協(xié)議的軟件稱為”傳輸實(shí)體“,傳輸層之間出傳輸?shù)膱?bào)文稱為”傳輸協(xié)議數(shù)據(jù)單元(TPDU)“
傳輸層實(shí)現(xiàn)分布式進(jìn)程通信,首先就要解決進(jìn)程標(biāo)識(shí)的問題,在計(jì)算機(jī)網(wǎng)絡(luò)中,只有知道IP地址和端口號(hào),才能唯一找到通信的進(jìn)程,即:
傳輸層端口號(hào) + 網(wǎng)絡(luò)層IP地址 = IP:端口
用一個(gè)例子來類比:
要找XX學(xué)校教學(xué)樓的601教室,所以必須知道學(xué)校地址和課室號(hào),學(xué)校相當(dāng)于IP地址,601教室相當(dāng)于端口號(hào)
TCP/IP傳輸層的尋址是通過TCP與UDP端口號(hào)來實(shí)現(xiàn)的,TCP與UDP規(guī)定用不同的端口號(hào)來表示不同的應(yīng)用程序
在TCP/IP協(xié)議中,端口號(hào)的數(shù)值取0-65535,且端口號(hào)分為三種類型:熟知端口號(hào),注冊(cè)端口號(hào)和臨時(shí)端口號(hào)
TCP/UDP給每種標(biāo)準(zhǔn)的Internet服務(wù)器進(jìn)程分配一個(gè)確定的全局端口號(hào),由IANA同一分配
當(dāng)用戶開發(fā)新的網(wǎng)絡(luò)應(yīng)用程序時(shí),可以為這種新的網(wǎng)絡(luò)應(yīng)用程序的服務(wù)器程序在IANA登記一個(gè)注冊(cè)端口號(hào)
由運(yùn)行在客戶上的TCP/UDP軟件隨機(jī)選取的,只對(duì)一次進(jìn)程通信有效
網(wǎng)絡(luò)中的兩臺(tái)主機(jī)要實(shí)現(xiàn)進(jìn)程通信,它們必須事先約定好傳輸層協(xié)議,如果一臺(tái)用TCP,另一臺(tái)用UDP,由于兩種協(xié)議的報(bào)文格式,端口號(hào)分配的問題,會(huì)使得兩臺(tái)主機(jī)無法正常通信。
如果考慮到進(jìn)程標(biāo)識(shí)和多重協(xié)議識(shí)別,網(wǎng)絡(luò)中一個(gè)進(jìn)程的全網(wǎng)唯一的標(biāo)識(shí)應(yīng)該用三元組來表示:協(xié)議+IP地址+端口號(hào);當(dāng)兩臺(tái)主機(jī)通信時(shí),一個(gè)完整的通信標(biāo)識(shí)需要五元組:協(xié)議+本地IP地址+本地端口號(hào)+遠(yuǎn)程地址+遠(yuǎn)程端口號(hào)
一臺(tái)運(yùn)行TCP/IP協(xié)議的主機(jī)可能同時(shí)運(yùn)行不同的應(yīng)用程序,這些應(yīng)用程序有的使用TCP,有的使用UDP,而TCP/IP協(xié)議允許多個(gè)不同應(yīng)用程序的數(shù)據(jù),同時(shí)使用IP地址和一個(gè)物理連接來發(fā)送和接受數(shù)據(jù)
多路復(fù)用和多路分解工作流程:
1. IP協(xié)議把TCP和UDP的TPDU都封裝在一個(gè)IP分組上,發(fā)送到接收端
2. 接收端從IP分組中拆出TPDU傳送到傳輸層
3. 傳輸層更具不同TPDU的端口號(hào),區(qū)分出不同的TPDU屬性,分別傳送到不同的應(yīng)用程序
應(yīng)用層協(xié)議和傳輸層協(xié)議有三種類型:依賴TCP協(xié)議的應(yīng)用層協(xié)議,依賴UDP協(xié)議的應(yīng)用層協(xié)議,同時(shí)依賴TCP、UDP協(xié)議的應(yīng)用層協(xié)議
依賴TCP協(xié)議的應(yīng)用層協(xié)議:TELNET(虛擬終端協(xié)議)、SMTP(電子郵件協(xié)議)、FTP(文件傳輸協(xié)議)、HTTP(超文本傳輸協(xié)議)
依賴UDP協(xié)議的應(yīng)用層協(xié)議:SNMP(簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議)
同時(shí)依賴TCP、UDP協(xié)議的應(yīng)用層協(xié)議:DNS(域名服務(wù)協(xié)議)
源端口號(hào)和目的端口號(hào)
指包括報(bào)頭在內(nèi)的用戶數(shù)據(jù)報(bào)的總長(zhǎng)度,UDP的報(bào)頭規(guī)定為8字節(jié),而UDP長(zhǎng)度字段為16位,因此數(shù)據(jù)最大值為 2 ^ 16 - 8 = 65527
可選部分,用來檢測(cè)用戶數(shù)據(jù)報(bào)、UDP報(bào)頭和偽報(bào)頭傳輸過程中是否出錯(cuò)
UDP協(xié)議簡(jiǎn)潔,效率高,處理速度快,在P2P會(huì)話類中很突出,適用于實(shí)時(shí)語音與視頻傳輸
1. 視頻播放應(yīng)用
2. 簡(jiǎn)短的交互式應(yīng)用
3. 多播與廣播應(yīng)用
TCP傳輸數(shù)據(jù)前,源進(jìn)程端口和目標(biāo)進(jìn)程端口必須建立了TCP傳輸連接
支持一個(gè)服務(wù)器與多個(gè)客戶端,也支持一個(gè)客戶端與多個(gè)服務(wù)端
提供確認(rèn)重傳,擁塞控制功能
TCP報(bào)頭長(zhǎng)度為20~60字節(jié),其中基本長(zhǎng)度為20字節(jié),選項(xiàng)部分長(zhǎng)度可變?yōu)?0字節(jié)
包括源端口號(hào)和目的端口號(hào)
TCP是面向字節(jié)流的,它要為字節(jié)流中的每一個(gè)字節(jié)按順序編號(hào)當(dāng)TCP連接建立時(shí),雙方需要各自產(chǎn)生初始序號(hào),然后為字節(jié)順序編號(hào)。
例如一個(gè)TCP連接需要發(fā)送4500個(gè)字節(jié),初始序號(hào)為10000,分為5個(gè)報(bào)文段發(fā)送,則:
第一個(gè)報(bào)文段的字節(jié)序號(hào)范圍:10000~10999
第一個(gè)報(bào)文段的字節(jié)序號(hào)范圍:11000~11999
第一個(gè)報(bào)文段的字節(jié)序號(hào)范圍:12000~12999
第一個(gè)報(bào)文段的字節(jié)序號(hào)范圍:13000~13999
第一個(gè)報(bào)文段的字節(jié)序號(hào)范圍:14000~14499
表示一個(gè)進(jìn)程已經(jīng)正確接受序號(hào)為N的字節(jié),要求發(fā)送端發(fā)送序號(hào)為N+1的字節(jié)
報(bào)頭長(zhǎng)度在20~60字節(jié)
字段長(zhǎng)度為6位
控制字段定義了6種不同的控制位,同一時(shí)間可以設(shè)置1位或多位,控制字段用于TCP的建立連接和終止、流量控制,以及數(shù)據(jù)傳送過程
1. URG(緊急位)
表示該報(bào)文段優(yōu)先級(jí)高,盡快發(fā)送
2. ACK(確認(rèn)位)
TCP連接確定后的所有報(bào)文的ACK都要為1
3. PSH(推送位)
當(dāng)兩個(gè)進(jìn)程交互式通信時(shí),一端應(yīng)用進(jìn)程希望輸入一個(gè)命令后,能夠立即得到對(duì)方的響應(yīng),則PSH置為1
4. RST(復(fù)位位)
復(fù)位位為1,有兩種含義:一是因主機(jī)崩潰等原因造成TCP連接出錯(cuò),需要立即釋放連接,然后重建連接;二是拒絕一個(gè)非法TCP報(bào)文或拒絕釋放一個(gè)連接
5. SYN(同步位)
用于在建立連接時(shí)同步序號(hào)。例如,當(dāng)SYN=1,ACK=0,表示這是一個(gè)連接建立請(qǐng)求報(bào)文,同一建立連接的響應(yīng)報(bào)文為SYN=1,ACK=1
6. FIN(終止位)
FIN=1表示請(qǐng)求釋放TCP連接
窗口大小用于接收端通知發(fā)送端,下次最多可以發(fā)送多少字節(jié)數(shù)的報(bào)文
計(jì)算校檢和和UDP相同,只是UDP校檢和是可選的,TCP是必須的
表示TCP報(bào)文數(shù)據(jù)部分的最大長(zhǎng)度,默認(rèn)為536字節(jié),它的大小可以直接影響發(fā)送和接受緩沖區(qū)設(shè)置的大小和使用效率
TCP協(xié)議的工作分為三個(gè)階段:連接建立,報(bào)文傳輸,連接釋放
TCP連接建立需要經(jīng)過三次握手
關(guān)于為什么要三次握手,這涉及到一個(gè)著名的兩軍問題
第一次:A軍派人穿過紅軍告訴B軍要發(fā)動(dòng)總攻
第二次:B軍派此人再次穿過紅軍A軍,告知A軍,B軍已收到(此時(shí)A確定了B已經(jīng)收到,但是B不確定送信的人回去時(shí)有沒有被紅軍俘獲,所以需要第三次)
第三次:A再次派該人穿過紅軍,告知B軍,我已經(jīng)收到了你的確認(rèn)
(seq為隨機(jī)生成的序號(hào),ack為確認(rèn)號(hào))
記住不要弄混ACK和ack,ACK是標(biāo)志位,ack是確認(rèn)序號(hào)
SYN=1:連接建立請(qǐng)求報(bào)文
SYN=1+ACK=1:連接建立請(qǐng)求確認(rèn)報(bào)文
ACK=1:連接建立請(qǐng)求確認(rèn)報(bào)文
三次握手:
1. 客戶端開始為CLOSE狀態(tài),發(fā)送SYN=1,報(bào)文序號(hào)seq=x至服務(wù)端,此時(shí)客戶端進(jìn)入SYN-SEND狀態(tài)
2. 服務(wù)端開始為L(zhǎng)ISTEN狀態(tài),表示正在監(jiān)聽連接,服務(wù)端接受到SYN,于是發(fā)送SYN+ACK的報(bào)文,報(bào)文序號(hào)seq=y,ack為x+1,表示我已經(jīng)接受到客戶端的序號(hào)x的報(bào)文了,下次客戶端要給我發(fā)送序號(hào)x+1的報(bào)文,此時(shí)進(jìn)入SYN-RCVD狀態(tài)
3. 客戶端接收到SYN+ACK后,發(fā)送ACK,seq=x+1(因?yàn)榈?步中服務(wù)端ack=x+1,表示要客戶端下次要發(fā)送x+1的報(bào)文給我),ack=y+1,此時(shí)雙方進(jìn)入到ESTABLISHED狀態(tài),連接成功
FIN-WAIT-1:表示等待對(duì)方的FIN報(bào)文
FIN-WAIT-2:也是表示等待對(duì)方的FIN報(bào)文,此時(shí)是進(jìn)入到了半關(guān)閉狀態(tài)
TIME-WAIT:表示收到了對(duì)方的FIN報(bào)文,并發(fā)送出了ACK報(bào)文,就等2MSL后即可回到CLOSED可用狀態(tài)了,如果FIN_WAIT_1狀態(tài)下,收到了對(duì)方同時(shí)帶 FIN標(biāo)志和ACK標(biāo)志的報(bào)文時(shí),可以直接進(jìn)入到TIME_WAIT狀態(tài),而無須經(jīng)過FIN_WAIT_2狀態(tài)。
CLOSING: 這種狀態(tài)比較特殊,實(shí)際情況中應(yīng)該是很少見,屬于一種比較罕見的例外狀態(tài)。正常情況下,當(dāng)你發(fā)送FIN報(bào)文后,按理來說是應(yīng)該先收到(或同時(shí)收到)對(duì)方的 ACK報(bào)文,再收到對(duì)方的FIN報(bào)文。但是CLOSING狀態(tài)表示你發(fā)送FIN報(bào)文后,并沒有收到對(duì)方的ACK報(bào)文,反而卻也收到了對(duì)方的FIN報(bào)文。什 么情況下會(huì)出現(xiàn)此種情況呢?其實(shí)細(xì)想一下,也不難得出結(jié)論:那就是如果雙方幾乎在同時(shí)close一個(gè)SOCKET的話,那么就出現(xiàn)了雙方同時(shí)發(fā)送FIN報(bào) 文的情況,也即會(huì)出現(xiàn)CLOSING狀態(tài),表示雙方都正在關(guān)閉SOCKET連接。
CLOSE_WAIT: 這種狀態(tài)的含義其實(shí)是表示在等待關(guān)閉。怎么理解呢?當(dāng)對(duì)方close一個(gè)SOCKET后發(fā)送FIN報(bào)文給自己,你系統(tǒng)毫無疑問地會(huì)回應(yīng)一個(gè)ACK報(bào)文給對(duì) 方,此時(shí)則進(jìn)入到CLOSE_WAIT狀態(tài)。接下來呢,實(shí)際上你真正需要考慮的事情是察看你是否還有數(shù)據(jù)發(fā)送給對(duì)方,如果沒有的話,那么你也就可以 close這個(gè)SOCKET,發(fā)送FIN報(bào)文給對(duì)方,也即關(guān)閉連接。所以你在CLOSE_WAIT狀態(tài)下,需要完成的事情是等待你去關(guān)閉連接。
LAST_ACK: 這個(gè)狀態(tài)還是比較容易好理解的,它是被動(dòng)關(guān)閉一方在發(fā)送FIN報(bào)文后,最后等待對(duì)方的ACK報(bào)文。當(dāng)收到ACK報(bào)文后,也即可以進(jìn)入到CLOSED可用狀態(tài)了。
CLOSE:表示已關(guān)閉連接
TCP連接釋放需要四次握手
1. 客戶機(jī)發(fā)送”連接釋放請(qǐng)求報(bào)文“,提出連接釋放請(qǐng)求
2. 服務(wù)器收到”連接釋放請(qǐng)求報(bào)文“后,發(fā)送”連接釋放請(qǐng)求確認(rèn)報(bào)文“,服務(wù)器進(jìn)程向高層應(yīng)用進(jìn)程通知客戶請(qǐng)求釋放TCP連接,此時(shí)客戶機(jī)到服務(wù)器的TCP連接釋放,但是服務(wù)器到客戶機(jī)的TCP連接未斷開,此時(shí)如果服務(wù)器還有數(shù)據(jù)需要發(fā)送時(shí)可以繼續(xù)發(fā)送。這種狀態(tài)為”半關(guān)閉“狀態(tài)
3. 服務(wù)器沒有數(shù)據(jù)要發(fā)送后,服務(wù)器向客戶發(fā)送”連接釋放請(qǐng)求報(bào)文“。提出連接釋放請(qǐng)求
4. 客戶機(jī)收到”連接釋放請(qǐng)求報(bào)文“后,發(fā)送”連接釋放請(qǐng)求確認(rèn)報(bào)文“,此時(shí)TCP連接完全釋放
1. 保持計(jì)時(shí)器
2. 時(shí)間等待計(jì)時(shí)器
3. 重傳計(jì)時(shí)器
4. 堅(jiān)持計(jì)時(shí)器
TCP協(xié)議通過滑動(dòng)窗口機(jī)制來跟蹤和記錄發(fā)送字節(jié)的狀態(tài),實(shí)現(xiàn)差錯(cuò)控制功能
滑動(dòng)窗口大?。航邮斩送ㄖl(fā)送端,下次最多可以發(fā)送多少字節(jié)數(shù)的報(bào)文
TCP使用兩個(gè)緩存和兩個(gè)個(gè)窗口來控制字節(jié)流的傳輸
- 發(fā)送端TCP有一個(gè)緩存,用來存儲(chǔ)應(yīng)用進(jìn)程準(zhǔn)備發(fā)送的數(shù)據(jù),發(fā)送端對(duì)這個(gè)緩存設(shè)置一個(gè)發(fā)送窗口,只要窗口值不為0就可以發(fā)送報(bào)文段
- 接受端TCP有一個(gè)緩存,用于接受字節(jié)流,等待應(yīng)用進(jìn)程讀取,接收端設(shè)置一個(gè)接受窗口,窗口只大小等于接受緩存可以接受多少字節(jié)流的大小
注意:
1. 發(fā)送窗口 不能大于 接受窗口,也就是說,發(fā)送窗口的值是根據(jù)接受窗口的值來確定的
2. 當(dāng)接受緩沖區(qū)滿了時(shí),接受窗口為0,此時(shí)會(huì)發(fā)送一個(gè)“零窗口通知”給發(fā)送端,這是發(fā)送端會(huì)停止發(fā)送(跟堅(jiān)持計(jì)時(shí)器有關(guān))
窗口滑動(dòng)流程:
1. 差錯(cuò)控制和傳輸?shù)淖止?jié)流狀態(tài)分類
對(duì)字節(jié)流狀態(tài)的跟蹤,可以對(duì)正確傳輸?shù)淖止?jié)流進(jìn)行確認(rèn),從而達(dá)到利用滑動(dòng)窗口協(xié)議控制差錯(cuò)的目的
2. 發(fā)送窗口和可用窗口
3. 發(fā)送完畢后的窗口變化
4. 處理確認(rèn)并滑動(dòng)窗口
選擇重傳和數(shù)據(jù)鏈路層的相同,有拉回方式和選擇重傳方式
作用:流量控制的目的是為了控制發(fā)送端的發(fā)送速率,使之不超過接收端的接受速率,防止接收端來不及處理而導(dǎo)致報(bào)文段丟失
流量控制是點(diǎn)-點(diǎn)鏈路的通信量的局部控制
流量控制流程:
作用:擁塞控制用于防止過多的報(bào)文進(jìn)入網(wǎng)絡(luò),而造成路由器與鏈路過載。
擁塞控制是網(wǎng)絡(luò)報(bào)文總量的全局控制
當(dāng)擁塞發(fā)生時(shí)的條件:
對(duì)網(wǎng)絡(luò)資源需求 > 網(wǎng)絡(luò)可用資源
擁塞窗口
擁塞窗口:發(fā)送端根據(jù)擁塞情況確定的窗口值,是TCP實(shí)現(xiàn)擁塞控制最基本的手段,發(fā)送端在確定擁塞窗口大小時(shí),可以采用慢開始算法(從小到達(dá)逐步增加擁塞窗口)和擁塞避免算法
發(fā)送窗口,通知窗口(接收端的窗口),擁塞窗口
發(fā)送窗口的確定,應(yīng)該是通知窗口和擁塞窗口的較小值
只要發(fā)現(xiàn)網(wǎng)絡(luò)上沒有出現(xiàn)擁塞,就增大擁塞窗口;當(dāng)出現(xiàn)擁塞,就減小窗口值,問題是如何確定擁塞?
什么是一次往返:發(fā)送端發(fā)送報(bào)文給接收端,接收端在規(guī)定時(shí)間內(nèi)返回了確認(rèn)報(bào)文。
如果一次往返異常(沒有接受到接收端的確認(rèn)報(bào)文),說明出現(xiàn)擁塞
以二進(jìn)制指數(shù)增長(zhǎng)
第一次往返:擁塞窗口設(shè)為2,然后發(fā)送2個(gè)最大報(bào)文段
第二個(gè)往返:擁塞窗口設(shè)為4
第三次往返:擁塞窗口設(shè)為8
第四次往返:擁塞窗口設(shè)為16
………….
一次往返,擁塞窗口+1
設(shè)置一個(gè)閥值(慢開始閥值)k,當(dāng)前擁塞窗口為cwnd
- 當(dāng)cwnd < k時(shí),使用慢開始算法
- 當(dāng)swnd > k時(shí),使用擁塞避免算法
- 當(dāng)cwnd = k時(shí),都可以使用
假設(shè)出現(xiàn)異常時(shí),會(huì)出現(xiàn)什么樣的變化?
- 擁塞窗口置為1
- 閥值置為原來的1/2,即k/2
聯(lián)系客服