這一篇文章主要總結(jié)傳輸層相關(guān)的知識。
通過上一篇文章我們知道了金闽,網(wǎng)絡(luò)層和數(shù)據(jù)鏈路層做到了把數(shù)據(jù)傳遞到目的主機(jī)纯露,但是每一個(gè)主機(jī)上都運(yùn)行著多個(gè)進(jìn)程,我們需要把數(shù)據(jù)傳遞到目的主機(jī)的目的進(jìn)程上代芜,這個(gè)時(shí)候就需要用到端口號來確定目標(biāo)進(jìn)程埠褪,通過傳輸層協(xié)議來完成這一目標(biāo)。
1.UDP協(xié)議
UDP無連接挤庇,不可靠钞速,沒有擁塞控制能傳多快就傳多快。
UDP因?yàn)樽陨淼奶攸c(diǎn)精彩用于以下方面:
包總量較少的通信(DNS嫡秕、SNMP)
視頻渴语、音頻等多媒體通信(即時(shí)通信)
限定于LAN等特定網(wǎng)絡(luò)中的應(yīng)用通信
廣播通信(廣播、多播)
2.UDP報(bào)文
3.TCP協(xié)議
TCP面向連接昆咽,提供可靠數(shù)據(jù)傳輸驾凶,丟包重傳,擁塞控制掷酗。
4.TCP報(bào)文
5.三次握手
三次握手的過程:
synbit-> synbit+ackbit->ackbit
acknum可以理解為下一個(gè)想要的seqnum调违。
??:丟包處理
在數(shù)據(jù)傳輸?shù)倪^程中很有可能發(fā)生丟包,丟包只有兩種可能一種是synbit包丟了泻轰,一種是ack包丟了技肩。
如果客戶端傳給服務(wù)器的synbit包在傳輸過程中丟了,那么客戶端就等不到ack信號浮声,等待時(shí)間超過重傳超時(shí)時(shí)間(RTO)以后虚婿,就會重新向服務(wù)器發(fā)送synbit。
如果客戶端給服務(wù)器發(fā)送的synbit包正確到達(dá)了泳挥,但是回傳的ack信號在傳輸過程中丟失了雳锋,客戶端就遲遲沒有收到ack信號,客戶端認(rèn)為自己發(fā)送的包沒有被服務(wù)器接收到羡洁,等待時(shí)間超過重傳超時(shí)時(shí)間之后就重新向服務(wù)器發(fā)送synbit包玷过,而服務(wù)器其實(shí)已經(jīng)收到這個(gè)包了,他會把這個(gè)包丟棄同時(shí)回傳一個(gè)ack信號筑煮。
為什么不是兩次握手辛蚊?
三次握手才建立連接就是說客戶端再次給服務(wù)器發(fā)送ack信號的時(shí)候連接建立,而兩次握手就是說客戶端第一次給服務(wù)器發(fā)送synbit服務(wù)器收到了就建立了連接真仲。這樣做很有可能造成的問題就是客戶端發(fā)送給服務(wù)器的synbit在網(wǎng)絡(luò)傳輸?shù)倪^程中發(fā)生了時(shí)延袋马,客戶端等了一段時(shí)間沒有等到服務(wù)器發(fā)來了synbit+ack,就主動(dòng)關(guān)閉了連接秸应,而過了一會兒這個(gè)信號發(fā)給服務(wù)器了虑凛,服務(wù)器建立了連接碑宴,然而這個(gè)時(shí)候客戶端已經(jīng)不在了,只有服務(wù)器一端的連接是開啟的桑谍,這個(gè)連接是沒有意義的延柠,浪費(fèi)了服務(wù)器資源。
6.四次揮手
三次揮手的時(shí)候只能是客戶端主動(dòng)向服務(wù)器發(fā)起建立連接的請求锣披。
因?yàn)閠cp連接是雙向的贞间,任何一方都可以發(fā)起關(guān)閉連接的請求,當(dāng)一方的數(shù)據(jù)發(fā)送完畢以后想對方發(fā)一個(gè)fin信號雹仿,代表這一方向上不再發(fā)送數(shù)據(jù)增热。
比如圖中,client向server發(fā)送了finbit胧辽,代表client到server的數(shù)據(jù)傳輸終止峻仇。
server向client發(fā)送一個(gè)ack,但是此時(shí)并沒有終止連接邑商,仍然可以繼續(xù)從server向client發(fā)送數(shù)據(jù)摄咆,直到server數(shù)據(jù)傳輸完畢,才向client發(fā)送一個(gè)finbit信號奠骄。
client接收到服務(wù)器發(fā)送的finbit,給服務(wù)器發(fā)送確認(rèn)信號番刊,連接終止含鳞。
為什么是四次揮手?
服務(wù)器第一次收到來自客戶端的fin信號的時(shí)候芹务,可能還沒有傳輸完所有的數(shù)據(jù)蝉绷,只是先給客戶端發(fā)送一個(gè)確認(rèn)報(bào)文,告訴客戶端自己收到了信號枣抱。然后繼續(xù)把所有的數(shù)據(jù)發(fā)完熔吗,發(fā)完以后再發(fā)送fin信號關(guān)閉這一方向上的數(shù)據(jù)傳輸。
7.窗口
首先我們要知道為什么會有窗口這個(gè)概念佳晶,在傳遞數(shù)據(jù)的時(shí)候如果每次傳數(shù)據(jù)都要等到ack信號回傳過來再去傳遞新的數(shù)據(jù)速度太慢了桅狠,窗口就使得我們可以連續(xù)發(fā)送多個(gè)數(shù)據(jù)而不需要等到ack信號回傳過來再傳,而這個(gè)窗口就是無需等待確認(rèn)應(yīng)答就可以繼續(xù)發(fā)送數(shù)據(jù)包的最大數(shù)量轿秧。
??:窗口的滑動(dòng)中跌,窗口在數(shù)據(jù)包傳輸?shù)倪^程中是滑動(dòng)的,而且這個(gè)滑動(dòng)是cumulative的菇篡,比如說我們收到acknum=100漩符,那也就是說接收方已經(jīng)收到了seqnum = 100之前的包,那這個(gè)時(shí)候窗口就可以滑動(dòng)到seqnum = 100的位置驱还。
8.快速重傳
快速重傳就是發(fā)送端在接收到一個(gè)ack信號以后又連續(xù)收到了三個(gè)相同的ack信號(一共是4個(gè)ack信號)嗜暴,這就意味著之前傳遞的信號失敗了凸克,這個(gè)時(shí)候tcp不會等到重傳超時(shí)時(shí)間就會馬上重傳這個(gè)數(shù)據(jù)包。
9.TCP擁塞控制
如果在數(shù)據(jù)包傳遞的時(shí)候一開始就把窗口設(shè)計(jì)的很大闷沥,一下子就傳遞了大量的數(shù)據(jù)很容易造成擁塞萎战,因此tcp采用了慢啟動(dòng)+擁塞避免的方式。
1.首先把收發(fā)兩端的窗口大小都設(shè)置為1狐赡,當(dāng)收到ack信號時(shí)撞鹉,將窗口大小翻倍。(慢啟動(dòng))
2.窗口大小呈指數(shù)增長颖侄,增長很快鸟雏,這個(gè)時(shí)候就會產(chǎn)生丟包問題,我們可以通過3個(gè)重復(fù)的ack或者超過重傳超時(shí)時(shí)間來判斷丟包現(xiàn)象览祖。丟包之后記錄這個(gè)窗口的大小孝鹊,將窗口大小除以2,得到窗口大小閥值展蒂。并且將當(dāng)前窗口大小變?yōu)?又活。
??:這個(gè)地方有兩種處理方法一種就是因?yàn)槌^了重傳等待時(shí)間而檢測到丟包的話我們就把窗口大小變?yōu)?,然后開始慢啟動(dòng)锰悼。tcp tahoe
另一種就是因?yàn)槭盏搅巳齻€(gè)重復(fù)的ack之后監(jiān)測到丟包柳骄,我們就把窗口大小變成原來的一半然后每次窗口大小加1。tcp reno
3.如果再次出現(xiàn)丟包箕般,就重復(fù)之前的步驟耐薯。
10.流量控制
流量控制和擁塞控制是兩個(gè)不同的概念,流量控制是接收端控制發(fā)送端的發(fā)送速度丝里,接收端有一個(gè)緩沖區(qū)曲初,流量控制就是控制發(fā)送的速度避免發(fā)送的太快導(dǎo)致緩沖區(qū)溢出,從而導(dǎo)致丟包杯聚。
流量控制是用窗口實(shí)現(xiàn)的臼婆,實(shí)現(xiàn)流量控制的方式就是讓接收端的窗口大于發(fā)送端的窗口。
接收端回傳給發(fā)送端的包里有一個(gè)rwnd幌绍,就是接受窗口的大小颁褂,這個(gè)數(shù)值會被放在tcp報(bào)文的頭部回傳給發(fā)送端。
??:
擁塞控制主要是為了防止網(wǎng)絡(luò)過載傀广,給整個(gè)網(wǎng)絡(luò)造成過多的負(fù)擔(dān)痢虹。
而流量控制主要是針對點(diǎn)對點(diǎn)的數(shù)據(jù)傳輸,防止因?yàn)榘l(fā)送方的發(fā)送速度比接收方的接受速度快造成丟包主儡。