下圖必須背下來(lái)。尤其是傳輸層和網(wǎng)絡(luò)層的協(xié)議。
?
傳輸層最大數(shù)據(jù)包是65535字節(jié),而網(wǎng)絡(luò)層數(shù)據(jù)最大只有1480字節(jié)。所以需要分段,但是只要分段,就有可能丟包,因?yàn)榫W(wǎng)絡(luò)層不負(fù)責(zé)可靠傳輸。所以要求服務(wù)器和客戶端保持會(huì)話,直到數(shù)據(jù)傳輸完成。
->TCP(Transmission Control Protocol)傳輸控制協(xié)議
應(yīng)用場(chǎng)景:需要將要傳輸?shù)奈募侄蝹鬏敃r(shí);就需要TCP協(xié)議來(lái)建立會(huì)話實(shí)現(xiàn)可靠傳輸;同時(shí)也有流量控制功能。(例如QQ傳文件)
查看會(huì)話 netstat -n
查看建立會(huì)話的進(jìn)程 netstat -nb
->UDP(User Data Protocol)用戶數(shù)據(jù)報(bào)協(xié)議
應(yīng)用場(chǎng)景:一個(gè)數(shù)據(jù)包就能完成數(shù)據(jù)通信;不需要建立會(huì)話和流量控制;多播/廣播;是一種不可靠傳輸。(例如QQ聊天,屏幕廣播)
5.2 傳輸層協(xié)議和應(yīng)用層協(xié)議的關(guān)系
?
(1)TCP和UDP協(xié)議和不同的端口即可對(duì)應(yīng)一個(gè)應(yīng)用層的協(xié)議。注意,53大部分是與UDP相連。
(2)熟知數(shù)值一般為0-1023,登記端口號(hào)數(shù)值1024-49151,客戶端口號(hào)數(shù)值為49152-65535.
(3)常用的應(yīng)用層協(xié)議使用的端口(號(hào)):
http = TCP + 80
Https = TCP + 443
RDP = TCP + 3389
ftp = TCP + 21
共享文件夾 = TCP + 445
SMTP = TCP + 25
POP3 = TCP + 110
telnet = TCP + 23
SQL = TCP + 1433
DNS = UDP + 53
(注意與4.6 的協(xié)議號(hào)的區(qū)別)
5.3 服務(wù)和應(yīng)用層協(xié)議的關(guān)系
防火墻是基于網(wǎng)卡的,只打開(kāi)必要的端口,不必要的端口不允許接收數(shù)據(jù),不影響服務(wù)的運(yùn)行和監(jiān)聽(tīng)。
服務(wù)使用TCP或UDP的端口偵聽(tīng)客戶端請(qǐng)求;
客戶端使用IP地址定位服務(wù)器,使用目標(biāo)端口,定位服務(wù);
可以在服務(wù)器網(wǎng)卡上設(shè)置只開(kāi)放必要的端口,實(shí)現(xiàn)服務(wù)器網(wǎng)絡(luò)安全。
5.3.1 如何在Windows上安裝服務(wù)
DNS服務(wù)
Web服務(wù)
SMTP
POP3
5.3.2 如何查看服務(wù)偵聽(tīng)的端口
netstat -a
netstat -an 以數(shù)字的形式查看端口
netstat -n 查看建立的會(huì)話
netstat -nb 查看建立會(huì)話的進(jìn)程
telnet 192.168.80.100 3389 測(cè)試到遠(yuǎn)程計(jì)算機(jī)某個(gè)端口是否打開(kāi)
?
5.3.3 如何更改服務(wù)使用默認(rèn)端口可以迷惑病毒,使系統(tǒng)更加安全。
5.3.4 如何設(shè)置Windows網(wǎng)絡(luò)安全設(shè)置本地連接 TCP/IP篩選
?
網(wǎng)絡(luò)層實(shí)現(xiàn)如何把數(shù)據(jù)包從這個(gè)地址(服務(wù)器)發(fā)送到另一個(gè)地址(服務(wù)器)。
傳輸層實(shí)現(xiàn)如何讓這個(gè)應(yīng)用程序找到對(duì)應(yīng)計(jì)算機(jī)的應(yīng)用程序(相對(duì)應(yīng)的應(yīng)用程序?qū)崿F(xiàn)邏輯通信)。
?
5.4.2 傳輸層的主要功能(1)傳輸層為應(yīng)用進(jìn)程之間提供了端到端的邏輯通信(但網(wǎng)絡(luò)層是為主機(jī)之間提供邏輯通信)。
(2)傳輸層還要對(duì)收到的報(bào)文進(jìn)行差錯(cuò)檢驗(yàn)。
(3)傳輸層提供面向連接(TCP)和無(wú)連接(UDP)的服務(wù)。
?
(1)TCP的端口
端口用一個(gè)16位端口號(hào)進(jìn)行標(biāo)志。
端口號(hào)只具有本地意義,即端口號(hào)只是為了標(biāo)志本計(jì)算機(jī)應(yīng)用層的各進(jìn)程。在Internet中不同計(jì)算機(jī)的相同端口號(hào)是沒(méi)有聯(lián)系的(最好不要有沖突)。
5.5 UDP協(xié)議
(1)UDP是無(wú)連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接。
(2)UDP使用盡最大努力交付,即不保證可靠交付,同時(shí)也不使用擁塞控制。
(3)UDP是面向報(bào)文的,適合多媒體通信的要求。
(4)UDP支持一對(duì)一,一對(duì)多,多對(duì)一,多對(duì)多交互通信。
(5)UDP首部開(kāi)銷小,只有8個(gè)字節(jié)。
?
5.5.1 UDP的首部格式?
首部中的長(zhǎng)度指的是UDP用戶數(shù)據(jù)報(bào)的長(zhǎng)度(首部+數(shù)據(jù))。
偽首部用于檢驗(yàn)和,我的理解是偽首部是IP數(shù)據(jù)包首部的后部分。
?
5.6 TCP協(xié)議
(1)TCP是面向連接的傳輸層協(xié)議。(三次握手)
(2)每一條TCP連接智能有兩個(gè)端點(diǎn)(endpoint),每一條TCP連接只能時(shí)點(diǎn)對(duì)點(diǎn)的(一對(duì)一)。
(3)TCP提供可靠交付的服務(wù)。(確保不丟包)
(4)TCP提供全雙工通信。(因?yàn)樾枰邮斩说姆答?,例如如果接收端處理不過(guò)來(lái),可讓發(fā)送端慢一點(diǎn),流量控制)
(5)面向字節(jié)流。
?
如果要傳輸一個(gè)比較大的數(shù)據(jù),首先一次只會(huì)傳輸一小塊,這個(gè)數(shù)據(jù)塊的大小是沒(méi)有規(guī)律的。加上數(shù)據(jù)包數(shù)據(jù)幀的頭,發(fā)送給接收端,接收端去掉首部,再次拼接。
5.6.1 TCP的連接
(1)TCP把連接作為最基本的抽象。
(2)每一條TCP連接有兩個(gè)端點(diǎn)。
(3)TCP連接的端點(diǎn)不是主機(jī),不是主機(jī)的IP地址,不是應(yīng)用程序,也不是傳輸層協(xié)議端口,TCP連接的端點(diǎn)叫 套接字(socket).
->套接字socket = (IP地址:端口號(hào))
->每一條TCP連接唯一地被通信兩端的兩個(gè)套接字所確定,即:
->TCP連接 ::= {socket1, socket2} = {(IP1:port1), (IP2:port2)}
(4)端口號(hào)拼接到IP地址即構(gòu)成了套接字。
5.7 TCP如何實(shí)現(xiàn)可靠傳輸
(1)可靠傳輸?shù)墓ぷ髟怼V沟却齾f(xié)議。
?
->在發(fā)送完一個(gè)分組后,必須暫時(shí)保留已發(fā)送的分組的副本。
->分組和確認(rèn)分組都必須進(jìn)行編號(hào)。
->超時(shí)計(jì)時(shí)器的重傳時(shí)間應(yīng)當(dāng)比數(shù)據(jù)在分組傳輸?shù)钠骄禃r(shí)間更長(zhǎng)一些。
(2)確認(rèn)丟失和確認(rèn)遲到
?
(3)可靠通信的實(shí)現(xiàn)
->使用上述的確認(rèn)和重傳機(jī)制,微秒就可以在不可靠的傳輸網(wǎng)絡(luò)上實(shí)現(xiàn)可靠的通信。
->這種可靠傳輸?shù)膮f(xié)議常稱為自動(dòng)重傳請(qǐng)求ARQ(Automatic Repeat reQuest)。
->ARQ表明重傳的請(qǐng)求是自動(dòng)進(jìn)行的。接收方不需要請(qǐng)求發(fā)送方重傳某個(gè)出錯(cuò)的分組。
->缺點(diǎn),信道利用率低。
?
->信道利用率U
?
(4)流水線傳輸(發(fā)送方)
發(fā)送方可連續(xù)發(fā)送多個(gè)分組,不必每發(fā)完一個(gè)分組就停頓下來(lái)等待對(duì)方的確認(rèn)。由于信道上一直有數(shù)據(jù)不間斷的傳送,這種傳輸方式可獲得很高的信道利用率。
?
(5)連續(xù)ARQ協(xié)議
?
如果1確認(rèn)收到了,則滑動(dòng)窗口。
?
如果12收到了,3沒(méi)有收到,則滑動(dòng)窗口會(huì)會(huì)回溯到3位置,重新發(fā)送。
(6)累計(jì)確認(rèn)(接收方)
接收方一般采用累計(jì)確認(rèn)的方式。
優(yōu)點(diǎn):容易實(shí)現(xiàn),信道利用率高。
缺點(diǎn):不能向發(fā)送方反映出接收方已經(jīng)正確收到的所有分組的信息。
(1)源端口:2個(gè)字節(jié)16位。
(2)目的端口:2個(gè)字節(jié)16位。
(3)序號(hào):當(dāng)前數(shù)據(jù)的第一個(gè)字節(jié)在整個(gè)文件中的序號(hào)。
(4)確認(rèn)號(hào)ack:接收端發(fā)送,提示發(fā)送端下一次該發(fā)的數(shù)據(jù)在整個(gè)文件中的序號(hào)。接收端收到后,會(huì)把這個(gè)序號(hào)之前的數(shù)據(jù)從緩存中刪掉。
(5)數(shù)據(jù)偏移:當(dāng)前TCP報(bào)文段第多少個(gè)字節(jié)后是TCP的數(shù)據(jù)部分了。數(shù)據(jù)偏移最多表示1111,即15,他最多可以表示15乘以4,即60個(gè)字節(jié)的偏移量,所以選項(xiàng)+填充最多只能是40個(gè)字節(jié)。
(6)保留:6位,無(wú)作用。
(7)URG:urgent,意思是優(yōu)先級(jí)高,發(fā)送端優(yōu)先發(fā)送,而不是在緩存中排隊(duì)。
(8)ACK:acknowledge,1意味著確認(rèn)建立了會(huì)話。
(9)PSH:1意味著接收端優(yōu)先讀取,而不是在緩存中排隊(duì)。
(10)RST:reset,1意味著TCP會(huì)話出現(xiàn)嚴(yán)重錯(cuò)誤,必須釋放和重新連接。
(11)SYN:同步。1意味著要發(fā)起會(huì)話。
(12)FIN:finish,1意味著釋放連接。
(13)窗口:接收端先發(fā),發(fā)送端根據(jù)接收端的窗口尺寸確定發(fā)送端窗口尺寸。
(14)檢驗(yàn)和:
(15)緊急指針:只有URG為1才有用。
5.8.1 抓包分析P64
(1)
?
第一步,ARP,建立可靠傳輸
第二步,UDP(DNS同時(shí)占用UDP和TCP的53端口),域名解析
第三步,TCP,識(shí)別網(wǎng)關(guān)MAC地址
(2)cmd打開(kāi)控制臺(tái)如下,當(dāng)前是建立了2個(gè)會(huì)話。
?
(3)淺藍(lán):請(qǐng)求的數(shù)據(jù)包;深藍(lán):得到的結(jié)果;
192是我方地址;8是服務(wù)器地址;
?
(4)兩個(gè)SYN是雙方確認(rèn)建立了會(huì)話,MSS意思是最大數(shù)據(jù)包1460字節(jié),web端(219.148.36.48)最多能緩存win=64240字節(jié),我端(192.168.80.63)最多能緩存win=65535字節(jié),如果某一方發(fā)了另一方win字節(jié)個(gè)數(shù)據(jù)對(duì)方都沒(méi)有確認(rèn),那么就暫停。標(biāo)記為TCP這三行(12,13,14),不光是建立對(duì)話,還協(xié)商了一些參數(shù)。
?
(5)第15行,開(kāi)始正式通信,HTTP。GET的意思是我要訪問(wèn)這個(gè)網(wǎng)站了。白框內(nèi)寫著各個(gè)層的數(shù)據(jù)首部的結(jié)構(gòu)。
?
目標(biāo)端口Src Port是80,源端口Dst Port是1057,序號(hào)Sep是1,確認(rèn)號(hào)Ack是1,數(shù)據(jù)部分長(zhǎng)度是1-203字節(jié)。
?
(6)219->192是發(fā)送網(wǎng)頁(yè)信息,192->219是確認(rèn)反饋。注意,16第一次發(fā)送數(shù)據(jù)和19反饋接收是沒(méi)有數(shù)據(jù)len=0。
?
從建立會(huì)話,到傳輸數(shù)據(jù)到確認(rèn)反饋的一個(gè)過(guò)程如下,15-19。
?
A的發(fā)送窗口是由B的接受窗口長(zhǎng)度決定的。
在沒(méi)有收到B確認(rèn)收到之前,A不能刪掉滑動(dòng)窗口內(nèi)的內(nèi)容。
A可以持續(xù)給B發(fā)送,直到A的滑動(dòng)窗口內(nèi)數(shù)據(jù)都發(fā)了。
B收到后給A發(fā)確認(rèn)收到的反饋ACK,序號(hào)是下一個(gè)應(yīng)該發(fā)送的字節(jié)的序號(hào),A收到后,就可以滑動(dòng)窗口到對(duì)應(yīng)的位置。例如B反饋ACK是7,那么A的滑窗可以移動(dòng)到7位置,1-6刪除。21-26可以發(fā)送。
?
B收到1-6之后,也開(kāi)始滑窗,B的應(yīng)用程序可以讀取1-6的數(shù)據(jù)。B的滑窗繼續(xù)接收。
?
以上是正常狀態(tài)下的情況。如果出現(xiàn)丟失情況,例如7-9丟失,此時(shí)B反饋的ACK=7.因?yàn)?0-12收到了,因此B發(fā)送SACK(選擇性確認(rèn)),A只發(fā)送7-9.
?
?
5.9.2 超時(shí)重傳時(shí)間的確定
TCP美發(fā)送一個(gè)報(bào)文段,就對(duì)這個(gè)報(bào)文段設(shè)置一次計(jì)時(shí)器。只要計(jì)時(shí)器設(shè)置的重傳時(shí)間到了,但是還沒(méi)有收到數(shù)據(jù),那么就重傳這一報(bào)文段。
RTTs(new) = (1 - alpha) x (RTTs(old)) + alpha x (new RTT樣本)
超時(shí)重傳時(shí)間應(yīng)略大于上面得出的加權(quán)平均往返時(shí)間RTTs。alpha推薦值是0.125.
這個(gè)公式的目的是根據(jù)網(wǎng)速和帶寬的實(shí)時(shí)情況調(diào)整往返時(shí)間。
5.10 TCP如何實(shí)現(xiàn)流量控制P68
解決通信兩端處理時(shí)間不一樣的問(wèn)題。通過(guò)實(shí)時(shí)調(diào)整滑窗尺寸的大小(尺寸甚至可以是0)來(lái)實(shí)現(xiàn)流量控制。接收端主動(dòng)調(diào)整滑窗大小,發(fā)送端根據(jù)接收端發(fā)送的報(bào)文調(diào)整相應(yīng)的滑窗。發(fā)送端也會(huì)定時(shí)發(fā)送報(bào)文向接收端確認(rèn)滑窗信息,避免接收端發(fā)送的相關(guān)調(diào)整滑窗大小的報(bào)文丟失帶來(lái)的影響。
5.11 TCP如何避免網(wǎng)絡(luò)擁塞
(1)出現(xiàn)資源擁塞的條件:對(duì)資源需求的總和>可用資源。
(2)擁塞控制是一個(gè)全局性的過(guò)程,涉及到所有的主機(jī),所有的路由區(qū),以及與降低網(wǎng)絡(luò)傳輸性能有關(guān)的所有因素。
(3)流量控制往往指在給定的發(fā)送端和接收端之間的點(diǎn)對(duì)點(diǎn)通信量的控制,它所要做的就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便使接收端來(lái)得及接收。
5.11.1 擁塞控制起到的作用
紅線和綠線之間是數(shù)據(jù)丟失內(nèi)容。
?
5.11.2 慢開(kāi)始和擁塞避免
(1)發(fā)送方維持 擁塞窗口cwnd(congestion window)
(2)發(fā)送方控制擁塞窗口的原則是:
只要網(wǎng)絡(luò)沒(méi)有出現(xiàn)擁塞,擁塞窗口就再增大一些,以便把更多的分組發(fā)送出去;
只要網(wǎng)絡(luò)出現(xiàn)擁塞,擁塞窗口就減少一些,以減少注入到網(wǎng)絡(luò)中的分組數(shù)。
(3)慢開(kāi)始算法的原理
?
(4)設(shè)置慢開(kāi)始門限狀態(tài)變量ssthresh
慢開(kāi)始門限狀態(tài)變量ssthresh的用法如下:
當(dāng)cwnd<ssthresh時(shí),使用慢開(kāi)始算法;
當(dāng)cwnd>ssthresh時(shí),停止使用慢開(kāi)始算法,改用擁塞避免算法;
當(dāng)cwnd=ssthresh時(shí),使用慢開(kāi)始算法或擁塞避免算法均可;
(5)擁塞避免算法的思路
讓擁塞窗口cwnd緩慢地增大,即每經(jīng)過(guò)一個(gè)往返時(shí)間RTT就把發(fā)送方的擁塞窗口cwnd加1,而不是加倍,使擁塞窗口cwnd按線性規(guī)律緩慢增長(zhǎng)。
(6)當(dāng)網(wǎng)絡(luò)出現(xiàn)擁塞時(shí)對(duì)策
無(wú)論是在慢開(kāi)始階段還是在擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒(méi)有按時(shí)收到確認(rèn)),就要把慢開(kāi)始門限ssthresh設(shè)置為出現(xiàn)擁塞時(shí)的發(fā)送方窗口值的一半(但是不能小于2)。
然后把擁塞窗口cwnd重新設(shè)置為1,執(zhí)行慢開(kāi)始算法。
這樣做的目的就是要迅速減少主機(jī)發(fā)送到網(wǎng)絡(luò)中的分組數(shù),使得發(fā)生擁塞的路由器有足夠的時(shí)間吧隊(duì)列中積壓的分組處理完畢。
(7)慢開(kāi)始和擁塞避免算法的實(shí)現(xiàn)舉例
?
->擁塞避免并非指完全能夠避免擁塞。利用以上的措施要完全避免網(wǎng)絡(luò)擁塞還是不可能的。
->擁塞避免是說(shuō)在擁塞避免階段吧擁塞避免窗口控制為按線性規(guī)律增長(zhǎng),使網(wǎng)絡(luò)比較不容易出現(xiàn)擁塞。
5.11.3 快重傳和快恢復(fù)
快重傳算法首先要求接收方每收到一個(gè)失序的報(bào)文段后就立即發(fā)出重復(fù)確認(rèn),這樣做可以讓發(fā)送方及早知道有報(bào)文段沒(méi)有到達(dá)接收方。
當(dāng)發(fā)送端收到連續(xù)三個(gè)重復(fù)的確認(rèn)時(shí),就執(zhí)行“乘法減少”算法,即把慢開(kāi)始門限ssthresh減半,但擁塞窗口cwnd現(xiàn)在不設(shè)置為1,而是設(shè)置為慢開(kāi)始門限ssthresh減半后的數(shù)值,然后開(kāi)始執(zhí)行擁塞避免算法(“加法增大”),使擁塞窗口緩慢地線性增大。
?
5.11.4 發(fā)送窗口的實(shí)際上限制
取接收方窗口和 擁塞窗口 這兩個(gè)變量中的較小值。
發(fā)送窗口的上限制 = min {rwnd, cwnd}.
5.12 TCP傳輸連接管理
傳輸連接有三個(gè)階段,即:連接建立,數(shù)據(jù)傳送,連接釋放。
TCP連接的建立都是采用客戶服務(wù)器方式。
主動(dòng)發(fā)起連接建立的應(yīng)用進(jìn)程叫做客戶(client)。
被動(dòng)等待連接建立的應(yīng)用進(jìn)程叫做服務(wù)器(server)。
?
頭兩次握手除了確定雙方都能聯(lián)通外,還通知了雙方的一些端口信息。
第三次握手原因:假如沒(méi)有第三次握手,A發(fā)送報(bào)1,B沒(méi)有收到,A又發(fā)了一遍,B收到了,反饋報(bào)2.此時(shí)之前的報(bào)1,B又收到了,再次反饋報(bào)2. 因?yàn)锳已經(jīng)收到了報(bào)2了,他不會(huì)理會(huì)第二次的報(bào)2,但是B又在等A的反饋,于是雙方都在等。
聯(lián)系客服