一萌抵、傳輸層的功能
1.1 OSI和DoD模型
說明:在
TCP/IP
協(xié)議棧中,傳輸層有兩個協(xié)議TCP
和UDP
-
TCP
(Transmission Control Protocol
)舔稀,傳輸控制協(xié)議乳丰,這是一種可靠安全的傳輸協(xié)議。一般如果一個文件在傳輸時需要分段内贮,在需要使用此協(xié)議产园。此協(xié)議會建立一個會話,實現(xiàn)可靠傳輸贺归。而且還有流量控制功能淆两。可以使用命令netstat -nb
查看會話拂酣。 -
UDP
(User Data Protocol
)秋冰,用戶數(shù)據(jù)報協(xié)議。此協(xié)議一般用在文件只需要一個數(shù)據(jù)報就可以傳輸完的情況婶熬,不需要分段剑勾,不需要建立會話埃撵,也不需要流量控制,是一種不可靠的傳輸虽另≡萘酰可用于多播和廣播。
1.2 傳輸層協(xié)議和應用層協(xié)議之間的關系
說明:常用的應用層協(xié)議使用的端口有
http=TCP+80
捂刺、https=TCP+443
谣拣、RDP=TCP+3389
、ftp=TCP+21
族展、共享文件夾=TCP+445
森缠、SMTP=TCP+25
、PoP3=TCP+110
仪缸、telnet=TCP+23
贵涵、DNS=UDP+53
。這里相關的服務與應用層協(xié)議之間的關系是一個偵聽的關系恰画。當數(shù)據(jù)被發(fā)送到接收端的時候宾茂,接收端相應啟動的服務會進行偵聽。服務使用TCP
或UDP
的端口偵聽客戶的請求拴还,客戶端使用IP
地址定位服務器跨晴,使用目標端口定位服務,可以在服務器網(wǎng)卡上設置只開放必要的端口自沧,實現(xiàn)服務器的網(wǎng)絡安全坟奥。一些命令:
- 查看服務偵聽的端口
netstat -anb
- 產(chǎn)看建立的會話
netstat -n
- 查看建立會話的進程
netstat -nb
- 測試連接遠程計算機某個端口是否打開
telnet 192.168.80.100 3389
1.3 傳輸層功能
為相互通信的應用進程提供了邏輯通信
說明:傳輸層為應用進程之間提供端到端的邏輯通信(但網(wǎng)絡層是為主機之間提供邏輯通信),還要對收到的報文進行差錯檢測拇厢,提供面向連接和無連接的服務爱谁。
1.4 傳輸層的端口
說明:
-
TCP
的端口:使用一個16
位端口號進行標志,具有本地意義孝偎,即端口號只是為了標志本計算機應用層中的各進程访敌。在Internet
中不同計算機的相同端口號是沒有聯(lián)系的。
分類:
- 熟知的端口衣盾,數(shù)值一般為
0-1023
FTP:21
telnet:23
SMTP:25
PoP3:110
DNS:53
HTTP:80
https:443
RDP:3389
- 登記端口號寺旺,數(shù)值為
1024-49151
- 客戶端口號,數(shù)值為
49152-65535
势决,使用命令netstat -n | find "ESTABLISHED"
二阻塑、傳輸層協(xié)議UDP和TCP
2.1 UDP協(xié)議
2.1.1 主要特點
此協(xié)議是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接果复;使用盡最大努力交付陈莽,即不保證可靠交付,同時也不使用擁塞控制;是面向報文的走搁,沒有擁塞控制独柑,很適合多媒體通信的要求;支持一對一私植、一對多忌栅、多對一和多對多的交互通信;首部開銷小曲稼,只有八個字節(jié)。域名解析就是使用此協(xié)議者春。
2.1.2 UDP協(xié)議
說明:
UDP
協(xié)議的首部如上圖清女。其中長度是指UDP
用戶數(shù)據(jù)報的長度嫡丙。
2.2 TCP協(xié)議
2.2.1 概述
此協(xié)議是面向連接的傳輸層協(xié)議,每一條TCP
連接只能有兩個端點(endpoint
)读第,每一條TCP
連接只能是點對點的(一對一)曙博,此協(xié)議提供可靠交付的服務,提供全雙工通信怜瞒,面向字節(jié)流父泳。
2.2.2 TCP的連接
此協(xié)議把連接作為最基本的抽象,每一條TCP
連接有兩個端點吴汪,連接的端點不是主機惠窄,不是主機的IP
地址,不是應用程序漾橙,也不是傳輸層的協(xié)議端口杆融。TCP
連接的端點叫做套接字(socket
)。端口號拼接到IP
地址即構成了套接字霜运。socket=(IP:port)
脾歇,每一條TCP
連接唯一的被通信兩端的兩個端口(即兩個套接字)所確定。
2.2.3 可靠傳輸原理
說明:在傳輸過程中如果無差錯的情況則如圖(
a
)淘捡,發(fā)送端發(fā)出一個包藕各,接收端接收到之后反饋一個消息,讓發(fā)送端發(fā)送第二個包焦除,一次類推激况,直到數(shù)據(jù)發(fā)送完畢。這就是停止等待協(xié)議,因為如果接收端不反饋成功接收的消息誉碴,發(fā)送端是不會發(fā)送下一個數(shù)據(jù)報的宦棺。如果在傳輸過程中出現(xiàn)錯誤,則發(fā)送端需要等待黔帕,等待一個稍微大于往返時間(RTT
)的時間段,如果沒收到接收端的反饋呐芥,則超時重傳思瘟。
-
確認丟失和確認遲到
說明:當發(fā)送端發(fā)送一個數(shù)據(jù)后,接收端接收到了光绕,但是反饋的數(shù)據(jù)報丟了诞帐,那么發(fā)送端則重新發(fā)送前面的數(shù)據(jù)(認為沒有收到),此時發(fā)送端收到之后將其丟棄慧起,再次發(fā)送反饋的數(shù)據(jù)完慧。這種情況即確認丟失屈尼。而確認遲到是指在上面的情況中,反饋的消息不是丟失了演熟,而是發(fā)送太慢,導致發(fā)送端以為丟失了大溜,然后重傳,于是接收端繼續(xù)丟棄重復數(shù)據(jù)報付材,并發(fā)送一個反饋消息厌衔。 使用上述的確認和重傳機制富寿,我們就可以在不可靠的傳輸網(wǎng)絡上實現(xiàn)可靠的通信。這種可靠傳輸協(xié)議通常稱為自動重傳請求
ARQ(Automatic Repeate reQuest)
。ARQ
標明重傳的請求是自動進行的窖贤。接收方不需要請求發(fā)送方重傳某個出錯的分組。-
信道利用率
停止等待協(xié)議的優(yōu)點是簡單滤蝠,但缺點是信道利用率太低。
說明:從圖中我們可以看到發(fā)送的時間為Td
览闰,而一個往返的總時間為(Td+RTT+Ta
)压鉴。所以信道利用率U=Td/(Td+RTT+Ta)
太低击蹲。那如果要向提高信道利用率歌豺,可選的辦法有提高Td
类咧,即流水線傳輸:
這種情況下,就是讓發(fā)送端一直發(fā)送數(shù)據(jù)血巍,不要等待述寡。那么這種情況下如何實現(xiàn)可靠傳輸呢? -
連續(xù)ARQ協(xié)議
說明:如上有12
個數(shù)據(jù)報螟炫,而發(fā)送窗口為5
標明每次可以連續(xù)發(fā)送5
個數(shù)據(jù)報。發(fā)送5
個數(shù)據(jù)報之后等待然评,此時如果收到第一個數(shù)據(jù)報的反饋信息碗淌,那么發(fā)送窗口向后移動亿眠,發(fā)送第六個數(shù)據(jù)報缕探,依次類推爹耗。同時每接受到一個數(shù)據(jù)報的反饋消息倦始,則此數(shù)據(jù)報就可以從緩存中刪除了鞋邑。當然這種方式在確認反饋消息的時候效率不高枚碗,可以使用累積確認肮雨。 累積確認
接收方一般采用累計確認怨规。優(yōu)點是容易實現(xiàn)波丰,信道利用率高;缺點是不能向發(fā)送方反映出接收方已經(jīng)正確收到的所有分組的信息媚赖。累積確認就是在發(fā)送時,首先發(fā)送多個數(shù)據(jù)報捻撑,比如此時發(fā)送的五個數(shù)據(jù)報中顾患,第三個數(shù)據(jù)報沒有收到江解,此此時就會反饋給接收端已經(jīng)收到第二個數(shù)據(jù)報的信息鳖枕,而接收端則會從第三個數(shù)據(jù)報開始宾符,進行重發(fā)(當然也包括第四個和第五個數(shù)據(jù)報魏烫,雖然它們是發(fā)送成功的)。
2.2.4 TCP報文段的首部格式
說明:在發(fā)送數(shù)據(jù)時呐赡,有時候數(shù)據(jù)需要分成很多段發(fā)送罚舱,比如第一段為
0、1窃肠、2碧囊、3糯而、4
這五個數(shù)據(jù)組成的一個段熄驼,而序號就是指每一段數(shù)據(jù)中第一個小數(shù)據(jù)(即0
)在整個要發(fā)送的數(shù)據(jù)報中所占的位置(也是0
)瓜贾。當這個數(shù)據(jù)段被接收端收到之后會發(fā)送一個確認號祭芦,此時的確認號就是5
龟劲,即要求發(fā)送端發(fā)送序號為5
的數(shù)據(jù)段构订。TCP
的首部大多數(shù)情況為20
個字節(jié)悼瘾,但是也有情況不是,而此時就需要使用數(shù)據(jù)偏移(首部長度)表示從第幾個字節(jié)開始為真正的數(shù)據(jù)部分了烫扼,首部最長是60=(0xFF)*4
個字節(jié),這里的0xFF
即數(shù)據(jù)偏移能夠表示的最大十六進制數(shù)堰氓。
- 標記位
URG=1
表示在傳輸數(shù)據(jù)報時不需要排隊双絮,不管緩存中有多少數(shù)據(jù)。 - 標記位
ACK=0
表示確認號是無效的(在接收數(shù)據(jù)后其值為1
焚挠,但是如果還沒有發(fā)送數(shù)據(jù)宣蔚,那當然就是0
)挟鸠。 - 標記位
SYN=1
表示同步艘希,也就是這個數(shù)據(jù)報的發(fā)送需要建立一個會話。 - 標志位
PSH=1
表示接收端在將接收到的數(shù)據(jù)組裝的時候不排序营袜。 - 標志位
RST=1
表示TCP
會話出現(xiàn)了嚴重的問題,需要重新建立連接跪另。比如我們對某個打開但是會沒有完全打開時,點擊關閉嘲驾,則會出現(xiàn)這種情況。 - 標志位
FIN=1
表示數(shù)據(jù)傳輸已經(jīng)完畢了榕暇,需要釋放連接。
窗口占兩個字節(jié)筒饰,比如此時有兩個主機A业栅、B
谬晕。A
在發(fā)送數(shù)據(jù)時可以緩存的字節(jié)為65530
個字節(jié)碘裕,于是需要將這個窗口發(fā)送給B
,看B
的接收緩存是不是能夠滿足最大的窗口字節(jié)攒钳,需要統(tǒng)一帮孔。同樣,當B
向A
發(fā)送數(shù)據(jù)時也需要統(tǒng)一窗口。
緊急指針只有在標志位URG=1
的情況下才有作用文兢,這表示TCP
報文中數(shù)據(jù)部分中前面的多少個字節(jié)需要緊急處理晤斩。
選項中有很多信息,比如最大TCP
報文的長度為多少個字節(jié),是不是支持選擇性確認SACK
茫负。如果不夠四個字節(jié)則會進行填充勉失,以達到四個字節(jié)徒蟆。
2.2.5 TCP如何實現(xiàn)可靠傳輸
- 以字節(jié)為單位的滑動窗口技術
說明:首先注意發(fā)送窗口和接收窗口必須一致绷落,這里使用前面講到的停止等待協(xié)議。如果A
向B
發(fā)送數(shù)據(jù)撇寞,在不出錯的情況下鸟缕,比如將最前面的20
個字節(jié)分成了三段番甩,1~3、4~7、8~10追迟、11~20
進行發(fā)送厢绝,當B
還沒有收到相關數(shù)據(jù)時口予,A
是不能發(fā)送第21
個字節(jié)及之后的數(shù)據(jù)的,此時如果A
沒有收到B
的反饋浮声,則A
緩存中的數(shù)據(jù)是不能刪除的,窗口也是不能移動的嫌变,當B
反饋確認號為8
時,則A
緩存中,之前的數(shù)據(jù)就可以刪除了公黑,發(fā)送第八個字節(jié)后的數(shù)據(jù),同時A
的窗口可以向后移動了,可以發(fā)送21~27
的數(shù)據(jù)了,而B
中就可以將1~7
個字節(jié)提取出去了闷沥,緩存中就可以刪除苹祟,同時B
的窗口也會向后移動体谒,依次類推贮聂。但是如果在傳輸過程中8~10
這一段數(shù)據(jù)丟失了甘穿,其他段都接收到了妨托,于是會通過前面講的選擇性確認SACK
來告訴A
哪一段缺失了,要求重發(fā)判族。注意君躺,不是一收到數(shù)據(jù)就發(fā)送確認侮邀,而是發(fā)現(xiàn)接收的數(shù)據(jù)不是連續(xù)的才發(fā)送確認號。
2.2.6 超時重傳時間的選擇
TCP
每發(fā)送一個報文段贝润,就對這個報文段設置一次計時器绊茧。只要計時器設置的重傳時間到但還沒有收到確認,就要重傳這一報文段打掘。
超時重傳時間應略大于上面得出的加權平均往返時間
RTTs
华畏。RFC2988
推薦的α
值為1/8
。
2.2.7 TCP的流量控制
用于解決發(fā)送端和接收端處理數(shù)據(jù)能力不同的問題尊蚁。比如A
發(fā)送數(shù)據(jù)很快亡笑,但是B
的處理能力有限,很快A發(fā)送的數(shù)據(jù)就將B
的緩存占滿了横朋,不能再接收數(shù)據(jù)了仑乌,比如先進行一部分處理才能再次接收,于是B
需要向A
告知這一點琴锭,這就是流量控制晰甚。在傳輸數(shù)據(jù)的過程中會根據(jù)自己的處理能力實時反饋相應的窗口,如果不能處理數(shù)據(jù)决帖,則將窗口設置為零厕九,先處理一部分數(shù)據(jù)之后再反饋相關信息,當接收端表示能夠繼續(xù)接收數(shù)據(jù)了地回,于是向發(fā)送端發(fā)送新的窗口和確認號止剖,但是這個反饋信息如果丟失了怎么辦?這里發(fā)送端會定時的發(fā)送窗口測定的數(shù)據(jù)報來檢查接收端的窗口落君。
2.2.8 TCP擁塞控制
出現(xiàn)資源擁塞的條件:對資源需求的綜合大于可用資源穿香。
擁塞控制是一個全局性的過程,涉及到所有的主機绎速、所有的路由器皮获,以及與降低網(wǎng)絡傳輸性能有關的所有因素。
流量控制往往指在給定的發(fā)送端和接收端之間的點對點通信量的控制纹冤,它所要做的就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率洒宝,以便使接收端來得急接收购公。
-
擁塞控制所起的作用
說明:比如此時網(wǎng)路中最大的處理能力為100M
,但是現(xiàn)在各個主機不管雁歌,都向其發(fā)送數(shù)據(jù)宏浩,使得發(fā)送的數(shù)據(jù)達到500M
,此時可能路由器忙不過來了靠瞎,可能只能處理了10M
的數(shù)據(jù)比庄,或者還可能死機,導致吞吐量極大的降低乏盐,這就是擁塞佳窑。而TCP
都會有一個擁塞控制的作用,一般如果發(fā)現(xiàn)網(wǎng)絡較忙時父能,就會協(xié)調傳輸速度神凑,可能此時發(fā)送了90M
的數(shù)據(jù),但是網(wǎng)絡正確處理了85
個何吝,此時網(wǎng)絡的吞吐量卻是很高的溉委。 -
慢開始和擁塞避免
發(fā)送方維持擁塞窗口cwnd(congestion window)
。發(fā)送放控制擁塞窗口的原則是:
1爱榕、只要網(wǎng)絡沒有出現(xiàn)擁塞瓣喊,擁塞窗口就再增大一些,以便把更多的分組發(fā)送出去
2呆细、只要網(wǎng)絡出現(xiàn)擁塞,擁塞窗口就減小一些八匠,以減少注入到網(wǎng)絡中的分組數(shù)絮爷。
慢開始算法的原理:
說明:可以看到開始的時候只是發(fā)送了一個數(shù)據(jù)報坑夯,之后慢慢的增加發(fā)送速度,當然每次都會檢查網(wǎng)路傳輸?shù)那闆r,在網(wǎng)絡暢通的情況下才會增加發(fā)送速度蹋偏,反之則降低發(fā)送速度黎棠。
說明:剛開始的時候速度增長是以2
的倍數(shù)增加,當達到慢開始門限后关翎,則是每次增加1
的速度增加葬凳。當速度達到24
時發(fā)現(xiàn)出現(xiàn)了擁塞昌简,于是則要計算一個新的慢開始門限,即此時速度的一般12
樊诺,如果還是擁塞,則繼續(xù)計算新的慢開始門限音同,之后則又開始慢慢增長词爬,同時注意,此時的慢開始門限就是12
了权均,而不是最開始的16
顿膨。
注意:擁塞避免并非指完全能夠避免擁塞。而是在說在擁塞避免階段把擁塞窗口控制為按線性規(guī)律增長叽赊,使網(wǎng)絡比較不容易出現(xiàn)擁塞恋沃。這是最開始的擁塞控制方法,之后又出現(xiàn)了新的方法必指,即快重傳和快恢復囊咏。 -
快重傳和快恢復
快重傳:比如此時發(fā)送端向接收端發(fā)送了1、2塔橡、3梅割、4、5
這樣一個數(shù)據(jù)段葛家,但是在發(fā)送的過程中第三個數(shù)據(jù)丟失了户辞,根據(jù)之前講的累積確認,此時還是必須等到第4癞谒、5
個數(shù)據(jù)接收到之后才發(fā)送確認號底燎,但是要知道只要收到的數(shù)據(jù)為1、2弹砚、4
双仍,發(fā)送端就已經(jīng)知道丟包了,于是此時會向發(fā)送端連續(xù)發(fā)送三個相同的確認號迅栅,讓其發(fā)送第三個數(shù)據(jù)報殊校,這就是快重傳晴玖。
快恢復:如上读存,丟失第三個數(shù)據(jù)報可能是因為擁塞,于是發(fā)送端會降低擁塞窗口呕屎,比如此時減小到了1
让簿,但是對于接收端發(fā)送的三個相同的確認號,此時卻都收到了秀睛,這標明此時網(wǎng)絡又是很好的尔当,不再擁塞了,此時就不會向之前那樣先指數(shù)再線性這樣增長了,而是讓擁塞窗口快速恢復到12
椭迎,然后線性增長锐帜,這是相對慢開始來說的。
發(fā)送窗口的實際上限值
發(fā)送方的發(fā)送窗口的上限值應當取為接收方窗口和擁塞窗口這兩個變量中較小的一個畜号,即應按一下公式確定:
發(fā)送窗口的上限值= Min{rwnd, cwnd}
2.2.9 TCP的運輸連接管理
傳輸連接有三個階段缴阎,即:連接建立、數(shù)據(jù)傳送和連接釋放简软。TCP
連接的建立都是采用客戶服務器方式蛮拔。主動發(fā)起連接建立的應用進程叫客戶(client
),被動等待連接建立的應用進程叫做服務器(server
)痹升。
-
三次握手建立
TCP
連接
說明:建立連接個過程中首先客戶端發(fā)送一個同步數(shù)據(jù)報建炫,此時同步標記SYN=1
,標志位ACK=0
疼蛾,序號seq=x
肛跌。服務器接受到這樣一個數(shù)據(jù)報之后就知道這是一個主動發(fā)起連接的數(shù)據(jù)報,此時服務器發(fā)送一個數(shù)據(jù)報据过,其中SYN=1
惋砂,標志位ACK=1
,序號seq=y
绳锅,由服務器指定西饵,確認號ack=x+1
,讓客戶端發(fā)送第x+1
個字節(jié)鳞芙,接下來眷柔,客戶端就再次發(fā)送確認數(shù)據(jù)報,此時就沒有同步標記了原朝。在前兩次數(shù)據(jù)傳輸中已經(jīng)足夠確定網(wǎng)絡是否暢通驯嘱,那么為什么還要發(fā)第三次確認數(shù)據(jù)?這是因為當客戶端發(fā)起請求喳坠,而這個請求可能在網(wǎng)路傳輸中傳輸較慢鞠评,一直沒有到達服務器,于是客戶端再次發(fā)出請求壕鹉,而此時請求很快便到達剃幌,而此次會話在傳輸任務完成之后會話就斷開了,然而晾浴,第一次發(fā)起的請求數(shù)據(jù)報在之后又被服務器接受到了负乡,服務器以為這是客戶端又發(fā)起的請求,于是就向客戶端發(fā)出確認脊凰,然而可能此時客戶端不需要建立連接抖棘,于是便不理睬這個確認,于是服務器就一直等待客戶端的確認且發(fā)出數(shù)據(jù),這樣資源便被浪費了切省,這種情況多的時候服務器就可能宕機最岗。而在三次握手方式中,服務器如果接受到第三次確認后朝捆,那么就人為自己發(fā)出的確認信息有用仑性,于是就開始進行數(shù)據(jù)傳輸了,如果等了一段時間右蹦,沒有等到第三次確認诊杆,那么就釋放這個連接了。 -
三次握手建立
TCP
連接的各狀態(tài)
說明:客戶端發(fā)出第一次請求之后就變成了SYN-SENT
狀態(tài)何陆,而服務器收到之前是LISTEN
狀態(tài)晨汹,收到之后變?yōu)?code>SYN-RCVD狀態(tài),客戶端收到反饋后贷盲,發(fā)出請求淘这,狀態(tài)變?yōu)?code>ESTABLISHED,而服務器收到之后變?yōu)?code>ESTABLISHED巩剖。 -
TCP
的連接釋放
說明:連接過程如上铝穷。 -
連接釋放過程中的狀態(tài)
說明:連接必須經(jīng)過2MSL
的時間才真正釋放,因為最后一次客戶端向服務器確認的數(shù)據(jù)可能會丟失佳魔,所以需要等待曙聂。