一.概述
傳輸層位于七層模型的第四層,用戶功能里面的最底層钧汹,面向通信部分的最高層
傳輸層工作的位置是終端設(shè)備丈探,網(wǎng)絡(luò)中的路由器沒(méi)有傳輸層
傳輸層負(fù)責(zé)管理端到端的通信連接
進(jìn)程與進(jìn)程的通信
使用端口號(hào)(Port)來(lái)標(biāo)記不同的網(wǎng)絡(luò)進(jìn)程
端口(Port)使用16比特位表示(0~65535)
UDP協(xié)議
UDP(User Datagram Protocol)用戶數(shù)據(jù)報(bào)協(xié)議
UDP協(xié)議的位置
UDP協(xié)議的首部
源端口號(hào):源機(jī)器使用網(wǎng)絡(luò)的進(jìn)程
目的端口號(hào):目的機(jī)器正在使用的網(wǎng)絡(luò)進(jìn)程
UDP長(zhǎng)度:UDP數(shù)據(jù)報(bào)的長(zhǎng)度
校驗(yàn)和:檢測(cè)UDP數(shù)據(jù)報(bào)在傳輸過(guò)程中是否出錯(cuò)
UDP特點(diǎn)
UPD是無(wú)連接協(xié)議
UDP不能保證可靠的交付數(shù)據(jù)(想發(fā)就發(fā),無(wú)法保證數(shù)據(jù)在網(wǎng)絡(luò)中是否丟失)
UDP是面向報(bào)文傳輸?shù)模嫦驁?bào)文:應(yīng)用層傳來(lái)的數(shù)據(jù)報(bào))
UDP沒(méi)有擁塞控制(把網(wǎng)絡(luò)比做一條公路崭孤,UDP不管網(wǎng)絡(luò)是否發(fā)生擁塞类嗤,都會(huì)盡量把數(shù)據(jù)交付出去給網(wǎng)絡(luò))
UDP的首部開(kāi)銷(xiāo)很小(首部開(kāi)銷(xiāo):源端口號(hào)辨宠,目的端口號(hào)遗锣,數(shù)據(jù)長(zhǎng)度,校驗(yàn)和這四部分)
TCP協(xié)議
TCP(Transmission Control Protocol)傳輸控制協(xié)議
TCP協(xié)議的特點(diǎn)
TCP是面向連接的協(xié)議
TCP的一個(gè)連接有兩端(點(diǎn)對(duì)點(diǎn)通信)
TCP提供可靠的傳輸服務(wù)
TCP協(xié)議提供全雙工的通信(全雙工:兩端可以同時(shí)發(fā)出數(shù)據(jù)和接收數(shù)據(jù))
TCP是面向字節(jié)流的協(xié)議(UDP是面向數(shù)據(jù)報(bào)的協(xié)議嗤形,TCP面向字節(jié)流精偿,字節(jié)流是流入進(jìn)程和流出進(jìn)程的字節(jié)序列,TCP不把應(yīng)用層的數(shù)據(jù)看作一整塊赋兵,而是看作一系列的字節(jié)流笔咽,可能會(huì)對(duì)用戶數(shù)據(jù)進(jìn)行拆分和合并進(jìn)行發(fā)送)
可靠傳輸?shù)幕驹?/h3>
停止等待協(xié)議,連續(xù)ARQ協(xié)議
停止等待協(xié)議
發(fā)送方發(fā)送消息到接收方霹期,接收方接收到消息后生成確認(rèn)消息叶组,發(fā)送給發(fā)送方,發(fā)送方收到確認(rèn)消息后再生成消息2發(fā)送給接收方历造。在這幾次消息發(fā)送和接收過(guò)程中甩十,雙方都要等待對(duì)方的消息接收到之后再發(fā)送新的消息。發(fā)送方發(fā)送消息后就停止生成新的消息吭产,等待接收方的確認(rèn)消息到達(dá)發(fā)送方后再生成第二個(gè)消息侣监。
連續(xù)ARQ協(xié)議
//待補(bǔ)充
滑動(dòng)窗口協(xié)議
//待補(bǔ)充
TCP報(bào)文頭部
其他部分待補(bǔ)充...
TCP標(biāo)記
TCP連接的建立
設(shè)主機(jī)B接收方運(yùn)行一個(gè)服務(wù)器進(jìn)程,它先發(fā)出一個(gè)被動(dòng)打開(kāi)命令臣淤,告訴它的TCP要準(zhǔn)備接收客戶進(jìn)程的連續(xù)請(qǐng)求橄霉,然后服務(wù)進(jìn)程就處于聽(tīng)的狀態(tài)。不斷檢測(cè)是否有客戶進(jìn)程發(fā)起連續(xù)請(qǐng)求邑蒋,如有姓蜂,作出響應(yīng)按厘。設(shè)主機(jī)A作為發(fā)送方,它先向自己的TCP發(fā)出主動(dòng)打開(kāi)的命令覆糟,表明要向某個(gè)IP地址的某個(gè)端口建立運(yùn)輸連接刻剥≌诳В客戶端發(fā)送的第一個(gè)數(shù)據(jù)包是一個(gè)請(qǐng)求報(bào)文段滩字,報(bào)文內(nèi)容包括同步位SYN=1,另一個(gè)是初始序號(hào)seq=x.TCP規(guī)定御吞,SYN=1的報(bào)文不能攜帶數(shù)據(jù)麦箍,但是消耗一個(gè)序列號(hào)√罩椋客戶端發(fā)送了這個(gè)報(bào)文之后挟裂,進(jìn)入SYN-SENT(同步已發(fā)送)狀態(tài)。
服務(wù)端已收到這個(gè)數(shù)據(jù)包之后揍诽,知道客戶端請(qǐng)求連接诀蓉,如果當(dāng)前有資源,可以同意連接暑脆,則給客戶端發(fā)送確認(rèn)報(bào)文渠啤。確認(rèn)報(bào)文的內(nèi)容包括SYN=1(沒(méi)有變化),seq=y(服務(wù)端的序列號(hào))添吗,新增ACK=1沥曹,ack=x+1(客戶端序列號(hào)+1)這里的SYN=1,所以報(bào)文不能攜帶數(shù)據(jù)碟联,同樣消耗了服務(wù)端的一個(gè)序列號(hào)妓美,然后服務(wù)端進(jìn)入了SYN-RCVD(同步收到)狀態(tài)。
客戶端收到服務(wù)端的確認(rèn)報(bào)文后鲤孵,還需要給服務(wù)端發(fā)送一個(gè)確認(rèn)報(bào)文壶栋。這個(gè)報(bào)文的內(nèi)容是ACK=1,seq=x+1,ack=y+1.這里沒(méi)有了SYN字段普监,可以攜帶數(shù)據(jù)贵试。客戶端確認(rèn)報(bào)文發(fā)送出去之后鹰椒,客戶端進(jìn)入ESTABLISKED(已建立連接)
服務(wù)端接收到這個(gè)數(shù)據(jù)包之后锡移,也進(jìn)入了ESTABLISHED(已建立連接)狀態(tài)。
為什么發(fā)送方要發(fā)出第三個(gè)確認(rèn)報(bào)文呢漆际?
首先建立連接淆珊,必須要有兩次握手吧,客戶端主動(dòng)一次奸汇,告知服務(wù)端施符,我想和你建立連接往声,然后看服務(wù)端是否同意。然后如果服務(wù)端同意的話戳吝,得給一個(gè)回復(fù)浩销,然后開(kāi)始等待客戶端的數(shù)據(jù)包,這就是兩次握手听哭。如果這個(gè)時(shí)候就建立連接慢洋,客戶端開(kāi)始給服務(wù)端發(fā)送數(shù)據(jù)包,在正常情況下沒(méi)啥問(wèn)題陆盘。但是由于網(wǎng)絡(luò)并不是100%任何時(shí)候都穩(wěn)定普筹,一旦因?yàn)槟承┰驅(qū)е路?wù)端發(fā)送給客戶端的確認(rèn)報(bào)文丟失,那這個(gè)時(shí)候客戶端收不到確認(rèn)數(shù)據(jù)包隘马,會(huì)誤以為服務(wù)端不同意連接太防,不會(huì)給服務(wù)端發(fā)送數(shù)據(jù)包,但是這時(shí)候服務(wù)端已經(jīng)在等待了酸员。這樣的差錯(cuò)會(huì)導(dǎo)致服務(wù)端一直處于等待狀態(tài)蜒车,浪費(fèi)資源。
? ? ? ? 而三次握手的話幔嗦,客戶端在確認(rèn)服務(wù)端同意之后再發(fā)一次數(shù)據(jù)包給服務(wù)端酿愧,告知服務(wù)端,不管怎么樣我都會(huì)給你發(fā)送數(shù)據(jù)包的崭添。因?yàn)門(mén)CP協(xié)議中寓娩,建立連接之后,每一次發(fā)送數(shù)據(jù)包客戶端都會(huì)等待服務(wù)端的確認(rèn)信息呼渣,如果收不到某一個(gè)數(shù)據(jù)包的確認(rèn)信息棘伴,客戶端就會(huì)重發(fā)這個(gè)數(shù)據(jù)包。這樣就不會(huì)發(fā)生差錯(cuò)了屁置。
已經(jīng)失效的鏈接請(qǐng)求報(bào)文傳送到對(duì)方引起錯(cuò)誤
TCP連接的釋放
?當(dāng)TCP連接需要釋放時(shí)焊夸,客戶端和服務(wù)端都是處于ESTABLISHED(已建立連接)狀態(tài)。此時(shí)蓝角,客戶端數(shù)據(jù)發(fā)送完畢阱穗,想要結(jié)束連接,主動(dòng)發(fā)出連接釋放請(qǐng)求數(shù)據(jù)包使鹅。這個(gè)數(shù)據(jù)包內(nèi)容:Fin=1揪阶,seq=u(這個(gè)u是這個(gè)數(shù)據(jù)包之前一個(gè)數(shù)據(jù)包的序列號(hào)+1),客戶端進(jìn)入FIN-WAIT-1(終止等待1)狀態(tài)患朱,不再發(fā)送數(shù)據(jù)包鲁僚,等待服務(wù)端的確認(rèn)。
服務(wù)端接收到釋放數(shù)據(jù)包之后發(fā)出確認(rèn),確認(rèn)包中內(nèi)容:確認(rèn)號(hào)ack=u+1冰沙,序列號(hào)seq=v(這個(gè)v是服務(wù)端上一個(gè)發(fā)送的數(shù)據(jù)包的序列號(hào)+1)侨艾,另一個(gè)是ACK=1。然后服務(wù)端進(jìn)入CLOSE-WAIT(關(guān)閉等待)拓挥。這個(gè)時(shí)候客戶端到服務(wù)端的連接已經(jīng)結(jié)束了唠梨。但是TCP是全雙工通信,因?yàn)檫@個(gè)時(shí)候是客戶端主動(dòng)發(fā)起的結(jié)束侥啤,在服務(wù)端這邊可能還存在著數(shù)據(jù)沒(méi)有完全發(fā)送給客戶端当叭,所以服務(wù)端到客戶端仍然沒(méi)有結(jié)束≡钙澹客戶端已經(jīng)不能在發(fā)送數(shù)據(jù)了科展,如果服務(wù)端還有數(shù)據(jù)發(fā)送過(guò)來(lái),客戶端仍然要接收糠雨。
? ? ? ? 客戶端收到服務(wù)端的確認(rèn)之后,進(jìn)入FIN-2(終止等待2)狀態(tài)徘跪,等待服務(wù)端發(fā)送服務(wù)端發(fā)器的連接釋放數(shù)據(jù)包甘邀。這時(shí)候服務(wù)端可能還有一些數(shù)據(jù)包要發(fā)送給客戶端,客戶端一一接收垮庐。最后松邪,沒(méi)有數(shù)據(jù)要發(fā)送了之后,服務(wù)端發(fā)送連接釋放數(shù)據(jù)包哨查,這個(gè)數(shù)據(jù)包內(nèi)容:FIN=1逗抑,ACK=1,seq=w(因?yàn)樵诜?wù)端回復(fù)客戶端的連接請(qǐng)求(數(shù)據(jù)包的序列號(hào)是v)之后寒亥,可能仍然有其他數(shù)據(jù)包要發(fā)送邮府,所以這里的w不一定是v+1),ack=u+1(確認(rèn)號(hào)和上次回復(fù)客戶端的請(qǐng)求釋放連接的確認(rèn)號(hào)一樣)溉奕。接著服務(wù)端進(jìn)入LAST-ACK(最后確認(rèn)狀態(tài))褂傀,等待客戶端的確認(rèn)。
客戶端收到服務(wù)端的連接釋放數(shù)據(jù)包之后加勤,發(fā)出一個(gè)確認(rèn)數(shù)據(jù)包仙辟,內(nèi)容:ACK=1,seq=u+1鳄梅,ack = w+1叠国。然后客戶端進(jìn)入TIME-WAIT(時(shí)間等待)狀態(tài)。這個(gè)時(shí)候TCP還沒(méi)有釋放戴尸。仍需要經(jīng)過(guò)時(shí)間等待計(jì)時(shí)器設(shè)置的時(shí)間2MSL后粟焊,客戶端才會(huì)進(jìn)入CLOSED狀態(tài)。MSL稱(chēng)為最長(zhǎng)報(bào)文段壽命。RFC793建議把這個(gè)值設(shè)為2分鐘吆玖,那這樣的話筒溃,在客戶端收到服務(wù)端的連接釋放數(shù)據(jù)包之后,需要等待4分鐘才能進(jìn)入CLOSED狀態(tài)沾乘。這顯然時(shí)間太長(zhǎng)了怜奖,不過(guò)這個(gè)值設(shè)為2分鐘也只是建議,還是可以設(shè)置適合的時(shí)間的翅阵。最后服務(wù)端收到這個(gè)客戶端的確認(rèn)包之后就進(jìn)入了CLOSED狀態(tài)歪玲。顯然,服務(wù)端一般先于客戶端進(jìn)入關(guān)閉狀態(tài)掷匠。
之所以客戶端需要等待2MSL時(shí)間才完全結(jié)束TCP連接滥崩,原因有兩個(gè):
一、為了保證客戶端發(fā)送的最后一個(gè)確認(rèn)包能正確到達(dá)服務(wù)端讹语。因?yàn)槿绻捎诰W(wǎng)絡(luò)原因丟失的話钙皮,服務(wù)端會(huì)重新發(fā)送連接釋放數(shù)據(jù)包,在等待過(guò)程中顽决,如果真的發(fā)生這種情況就可以得到處理短条。客戶端每接收到一次服務(wù)端發(fā)送來(lái)的接釋放數(shù)據(jù)包都會(huì)重新設(shè)置時(shí)間等待計(jì)時(shí)器才菠,然后等待2MSL時(shí)間才完全結(jié)束TCP連接茸时。
二、等待才2MSL時(shí)間完全結(jié)束TCP連接赋访,可以避免再次開(kāi)啟TCP連接的時(shí)候收到上一次TCP連接存在網(wǎng)絡(luò)中的數(shù)據(jù)包可都,顯然這樣的數(shù)據(jù)包不是屬于本次連接的,是無(wú)效的數(shù)據(jù)包蚓耽。
? ? ? ?之所以需要四次握手來(lái)釋放連接渠牲,TCP是全雙工通信,支持兩個(gè)方向通信田晚,所以結(jié)束的時(shí)候嘱兼,每個(gè)方向?yàn)榱舜_保數(shù)據(jù)都能完全從一端到達(dá)另一端,所以結(jié)束的時(shí)候贤徒,一端發(fā)起結(jié)束申請(qǐng)數(shù)據(jù)包芹壕,另一端都要發(fā)送確認(rèn)數(shù)據(jù)包。兩個(gè)方向要分開(kāi)結(jié)束接奈,每次結(jié)束需要兩次握手踢涌,所以最終TCP的結(jié)束需要4次握手。