一、傳輸層的主要功能是什么?
分割并重新組裝上層提供的數(shù)據(jù)流,為數(shù)據(jù)流提供端到端的傳輸服務(wù)。
二、傳輸層如何區(qū)分不同應(yīng)用程序的數(shù)據(jù)流?
因?yàn)椋瑢?duì)應(yīng)傳輸層而言,它只需要知道目標(biāo)主機(jī)上的哪個(gè)服務(wù)程序來(lái)響應(yīng)這個(gè)程序,而不需要知道這個(gè)服務(wù)程序是干什么的。因此,我們只需要能夠抽象的表示出來(lái)這些應(yīng)用程序和服務(wù)程序即可。我們使用端口號(hào)來(lái)抽象標(biāo)識(shí)每個(gè)網(wǎng)絡(luò)程序。
因此:在同一IP地址(同一個(gè)目標(biāo)主機(jī))上不同的端口號(hào)是兩個(gè)不同的鏈接。IP地址和端口號(hào)用來(lái)唯一的確定網(wǎng)絡(luò)上數(shù)據(jù)的目的地。
三、傳輸層有哪些協(xié)議?
傳輸層的兩大協(xié)議:TCP(傳輸控制協(xié)議)UDP(用戶數(shù)據(jù)包協(xié)議)
TCP是一個(gè)可靠的面向鏈接的協(xié)議,UDP是不可靠的或者說(shuō)無(wú)連接的協(xié)議。
可以用打電話和發(fā)短信來(lái)說(shuō)明這種關(guān)系:
UDP就好似發(fā)短信,只管發(fā)出去,至于對(duì)方是不是空號(hào)(網(wǎng)絡(luò)不可到達(dá))能不能收到(丟包)等并不關(guān)心。
TCP好像打電話,雙方要通話,首先,要確定對(duì)方不是開(kāi)機(jī)(網(wǎng)絡(luò)可以到達(dá)),然后要確定是不是沒(méi)有信號(hào)(),然后還需要對(duì)方接聽(tīng)(通信鏈接)。
四、什么是UDP協(xié)議?
UDP數(shù)據(jù)包結(jié)構(gòu)如下圖所示
源端口(16) | 目標(biāo)端口(16) |
---|---|
報(bào)文長(zhǎng)度(16) | 校驗(yàn)和(16) |
數(shù)據(jù)(可變) |
UDP為應(yīng)用程序提供的是一種不可靠的、無(wú)連接的分組交付,因此,UDP報(bào)文可能會(huì)出現(xiàn)丟失、亂序、重復(fù)、延時(shí)等問(wèn)題。因?yàn)樗惶峁┛煽啃裕拈_(kāi)銷很小。(開(kāi)銷很小具體指什么?下文揭秘)
五、為什么有了UDP,還需要TCP?
問(wèn)題4中已經(jīng)說(shuō)到,UDP為應(yīng)用程序提供的是一種無(wú)連接、不可靠的分組交付。當(dāng)網(wǎng)絡(luò)硬件失效或者負(fù)擔(dān)太重時(shí),數(shù)據(jù)包可能就會(huì)產(chǎn)生丟失、重復(fù)、延時(shí)、亂序的現(xiàn)象。這些都會(huì)導(dǎo)致我們的通信不正常。如果讓?xiě)?yīng)用程序來(lái)?yè)?dān)負(fù)差錯(cuò)控制的工作,無(wú)疑將給程序員帶來(lái)許多復(fù)雜的工作,于是,我們使用獨(dú)立的通信協(xié)議來(lái)保證通信的可靠性是非常必要的。
六、什么是TCP協(xié)議?
傳輸控制協(xié)議TCP是一個(gè)面向鏈接的、可靠的通信協(xié)議。1. 在開(kāi)始傳輸前,需要進(jìn)行三次握手建立鏈接 2. 可靠性:在傳輸過(guò)程中,通信雙方的協(xié)議模塊繼續(xù)進(jìn)行通信 3. 通信結(jié)束后,通信雙方都會(huì)使用改進(jìn)的三次握手來(lái)關(guān)閉鏈接
TCP數(shù)據(jù)包結(jié)構(gòu)如下圖
源端口(16) | 目標(biāo)端口(16) | ||
---|---|---|---|
序號(hào)(32) | |||
應(yīng)答號(hào)(32) | |||
頭長(zhǎng)度(4) | 保留(6) | 編碼位(6) | 窗口(16) |
校驗(yàn)和(16) | 緊急(16) | ||
可選項(xiàng)(如果有,0或32) | |||
數(shù)據(jù)(可變) |
七、怎么理解協(xié)議和程序?
如同我們自定義的應(yīng)用層協(xié)議一樣:協(xié)議只是給出了一組規(guī)范,規(guī)定我們應(yīng)該怎么樣(按什么規(guī)則)保存數(shù)據(jù)。
在計(jì)算機(jī)間傳輸?shù)挠肋h(yuǎn)都是二進(jìn)制字節(jié)碼(對(duì)于傳輸層,可以理解為傳輸?shù)氖冀K是下層的IP數(shù)據(jù)包),是計(jì)算機(jī)中的程序通過(guò)對(duì)這些字節(jié)碼進(jìn)行邏輯分析、判斷,來(lái)控制程序完成差錯(cuò)控制等功能。 至于解析這些字節(jié)碼的程序,則可以有不同的實(shí)現(xiàn),只要我們按照規(guī)則來(lái)解析,并作出相應(yīng)的控制,我們大可以自己寫(xiě)個(gè)程序是實(shí)現(xiàn)相應(yīng)功能。
八、TCP是否真的有鏈接?
我們都知道,TCP通過(guò)完成三次握手來(lái)建立鏈接的,但是這種連接是面向虛電路的,是物理上不存在的,只是雙方的TCP程序,邏輯上的認(rèn)為建立了這樣的鏈接。
九、鏈接是如何建立的(邏輯上)?
假設(shè):當(dāng)我們?cè)谥鳈C(jī)A上啟動(dòng)一個(gè)程序,通過(guò)TCP去鏈接主機(jī)B上的9091端口。
整個(gè)過(guò)程是怎么樣的呢?邏輯上我們可以這么理解建立鏈接的過(guò)程:
1.SYN:seq=X;
1.1 A的TCP程序,為這個(gè)鏈接分配一個(gè)端口(設(shè)為9090)。
1.2 同時(shí)邏輯上的將TCP連接的狀態(tài)設(shè)置為:正在連接。(通過(guò)在鏈接狀態(tài)表中添加一條記錄,記錄中狀態(tài)為:正在連接)
1.3 同時(shí),隨機(jī)生成一個(gè)初始序列號(hào)X,生成一個(gè)TCP包,將初始化序列號(hào)X設(shè)置為T(mén)CP中的序列號(hào),發(fā)送給主機(jī)B。
2.SYN:seq=Y ACK:ack=X+1;
2.1 B上TCP程序收到該數(shù)據(jù)包,查詢9091端口狀態(tài),如果可以鏈接。
2.2 同樣的,在邏輯上的將TCP連接的狀態(tài)設(shè)置為:正在連接
2.3 同時(shí),隨機(jī)生成一個(gè)初始化序列號(hào)Y,根據(jù)接收的序列號(hào)X,生成應(yīng)答號(hào)X+1,生成一個(gè)TCP包,將序列號(hào)和應(yīng)答號(hào)分別設(shè)置到TCP包頭中,將TCP數(shù)據(jù)包發(fā)給主機(jī)A。
3.SYN:seq=X+1 ACK:ack=Y+1.
3.1 A上的TCP程序接收到數(shù)據(jù)包,查詢9090端口狀態(tài)。
3.2 根據(jù)收到的SYN:seq=Y;ACK:ack=X+1; 封裝一個(gè)TCP包 SYN:seq=x+1;ACK:ack=Y+1;發(fā)送給主機(jī)B。同時(shí),TCP程序?qū)㈡溄訝顟B(tài)表中該條記錄狀態(tài)設(shè)置為已連接。
3.3 主機(jī)B收到數(shù)據(jù)包,TCP程序?qū)㈡溄訝顟B(tài)表中該條記錄狀態(tài)設(shè)置為已連接。
至此,一個(gè)TCP鏈接建立(三次握手)完成。
我們可以看到:
第一:傳送的都是IP數(shù)據(jù)包,其實(shí)只是將收到的數(shù)據(jù)包交給TCP程序處理。
第二:鏈接狀態(tài),只是TCP程序中的一個(gè)邏輯狀態(tài)。
十、所謂的建立TCP鏈接開(kāi)銷很大,具體是指什么?
從九中,很容易看出。要簡(jiǎn)歷TCP鏈接,必須進(jìn)行三次IP數(shù)據(jù)包的成功傳輸。
十一、三次握手的目的是什么?
TCP是面向鏈接的,在面向鏈接的環(huán)境中,開(kāi)始傳輸數(shù)據(jù)之前,在兩個(gè)中端之間必須先建立一個(gè)鏈接。建立鏈接的過(guò)程可以確保通信雙方在發(fā)送應(yīng)用程序數(shù)據(jù)包之前,都已經(jīng)準(zhǔn)備好了傳送和接收數(shù)據(jù)。并且使通信雙方統(tǒng)一了初始化序列號(hào)。
十二、TCP如何提供可靠性?
在傳輸過(guò)程中,通信雙方的協(xié)議模塊繼續(xù)進(jìn)行通信,從而確保了傳輸?shù)目煽啃浴?針對(duì)亂序:在通過(guò)三次握手進(jìn)行鏈接時(shí),序列號(hào)被初始化。在傳輸過(guò)程中,TCP繼續(xù)使用這個(gè)序列號(hào)來(lái)標(biāo)記發(fā)送的每一個(gè)數(shù)據(jù)段,沒(méi)傳送一個(gè)數(shù)據(jù)段,序列號(hào)加一。接收方依據(jù)序列號(hào)重裝收到的數(shù)據(jù)段。 針對(duì)丟包:在傳輸過(guò)程中,接收方收到一個(gè)數(shù)據(jù)段后,會(huì)用ACK應(yīng)答碼向發(fā)送端回復(fù)一個(gè)IP包進(jìn)行應(yīng)答,確認(rèn)號(hào)ACK用來(lái)告訴發(fā)送端哪些數(shù)據(jù)包已經(jīng)成功接收,發(fā)送方對(duì)未被應(yīng)答的報(bào)文段提供重傳。 針對(duì)重復(fù):接收端收到數(shù)據(jù)段后,查看序列號(hào),如果已經(jīng)成功接收改數(shù)據(jù)包,則丟棄后面這個(gè)數(shù)據(jù)段。 針對(duì)延時(shí):延時(shí)造成的第一個(gè)問(wèn)題,就是數(shù)據(jù)包達(dá)到接收端時(shí)亂序。當(dāng)延時(shí)嚴(yán)重時(shí),接收端一直未收到數(shù)據(jù)段,則不會(huì)回復(fù)ACK,發(fā)送端認(rèn)為丟包,重發(fā)。
十三、什么是預(yù)期確認(rèn)?什么是肯定確認(rèn)與重新傳輸?哪些情況會(huì)重傳?
1.確認(rèn)號(hào)ACK會(huì)告訴發(fā)送端哪些數(shù)據(jù)段已經(jīng)成功接收,并且確認(rèn)號(hào)會(huì)向發(fā)送端指出接收端希望收到的下一個(gè)序列號(hào)。即,確實(shí)號(hào)ACK為上個(gè)數(shù)據(jù)序列號(hào)+1,這種機(jī)制稱為預(yù)期確認(rèn)。
2.為了提高效率,我們?cè)诎l(fā)送端,將數(shù)據(jù)段保存在緩沖區(qū)中,直道發(fā)送端收到來(lái)自接收端的確認(rèn)號(hào)。這種機(jī)制被稱為“肯定確認(rèn)與重新傳輸”。
3.當(dāng)發(fā)送端在給定時(shí)間間隔內(nèi)收不到那個(gè)數(shù)據(jù)段的應(yīng)答時(shí),發(fā)送端就會(huì)重傳那個(gè)數(shù)據(jù)段。 情況1:網(wǎng)絡(luò)延時(shí)/環(huán)路,數(shù)據(jù)段丟失 情況2:網(wǎng)絡(luò)延時(shí),數(shù)據(jù)段推遲到達(dá) 情況3:數(shù)據(jù)段成功到達(dá),應(yīng)答因?yàn)?.2不能達(dá)到。
十四、TCP中,序列號(hào)和應(yīng)答號(hào)有哪些作用?
從以上10,11,12中,很明顯的可以看到
1、依靠序列號(hào)重組數(shù)據(jù)段
2、依靠數(shù)據(jù)包消除網(wǎng)絡(luò)中的重復(fù)包
3、依靠序列號(hào)和應(yīng)答號(hào)進(jìn)行差錯(cuò)重傳,提高了TCP的可靠性
十六、為什么需要窗口技術(shù)?
前面我們已經(jīng)說(shuō)了,TCP的可靠性,是通過(guò)預(yù)期確認(rèn)來(lái)實(shí)現(xiàn)的。即發(fā)送方發(fā)送一個(gè)數(shù)據(jù)段后,需要得到對(duì)方的確認(rèn)后,才會(huì)發(fā)送下一個(gè)數(shù)據(jù)段。因此,假設(shè)一個(gè)數(shù)據(jù)段大小為64KB(IP包最大值),一次發(fā)送和確認(rèn)需要的時(shí)間為500MS,則,1S內(nèi),只能傳送128KB的數(shù)據(jù),如果帶寬為1M,顯然很浪費(fèi)帶寬。為了充分利用帶寬,我們使用窗口技術(shù)。滑動(dòng)窗口允許發(fā)送方在收到接收方的確認(rèn)之前發(fā)送多個(gè)數(shù)據(jù)段。(窗口大小決定了在收到確認(rèn)前可以發(fā)送的數(shù)據(jù)段數(shù)量)
十七:如何實(shí)現(xiàn)流量控制?
窗口數(shù)決定了當(dāng)前傳輸?shù)淖畲罅髁俊.?dāng)我們?cè)趥鬏斶^(guò)程中,通信雙方可以根據(jù)網(wǎng)絡(luò)條件動(dòng)態(tài)協(xié)商窗口大小,調(diào)整窗口大小時(shí),即可實(shí)現(xiàn)流量控制。(在TCP的每個(gè)確認(rèn)中,除了ACK外,還包括一個(gè)窗口通知)
十八、UDP的開(kāi)銷很小,具體是指什么?
1.因?yàn)閁DP是無(wú)連接的。在傳輸數(shù)據(jù)之前,不需要進(jìn)行復(fù)雜的三次握手來(lái)建立連接。2.在傳輸數(shù)據(jù)時(shí),沒(méi)有協(xié)議間通信流量(確認(rèn)信號(hào)),也不需要浪費(fèi)不必要的處理時(shí)間(接收確認(rèn)信號(hào)再發(fā)一下)。3;傳輸結(jié)束后,也不用再用改進(jìn)的三次握手來(lái)端口連接。
十九、UDP數(shù)據(jù)包、TCP數(shù)據(jù)包大小如何確認(rèn)?
1、無(wú)論TCP還是UDP數(shù)據(jù)包,都需要交給Internet層封裝為IP包,而一個(gè)IP包,包頭中的長(zhǎng)度位為16位,所以IP包最大為2的16方,即65535(64KB還需要減去各種包頭長(zhǎng)度)。
2、TCP因?yàn)槊嫦蛄鳎铱梢詰{借序列號(hào)對(duì)大文件進(jìn)行分段和重組,因此,TCP可以用來(lái)傳輸較大的文件。而UDP,如果要傳輸大于64KB的數(shù)據(jù),則需要自己在應(yīng)用層進(jìn)行差錯(cuò)控制。
3、為了提高傳輸效率和減少網(wǎng)絡(luò)通信量(協(xié)議間的通信),TCP也會(huì)一次傳輸足夠多的數(shù)據(jù)。
4、因?yàn)镸TU的存在,TCP包和UDP包不是越大越好。(在路由中分包,在接收端重組,加大路由與接收端負(fù)擔(dān),增大丟包概率。分組丟失,整個(gè)數(shù)據(jù)包重傳。)
二十:UDP適用哪些環(huán)境?TCP適用哪些環(huán)境?
適合UDP的環(huán)境:
1、在高效可靠的網(wǎng)絡(luò)環(huán)境中(不需要考慮網(wǎng)絡(luò)不好導(dǎo)致的丟包、亂序、延時(shí)、重復(fù)等問(wèn)題),因?yàn)閁DP是無(wú)連接的服務(wù),不用消耗不必要的網(wǎng)絡(luò)資源(TCP中的協(xié)議間通信)和處理時(shí)間(預(yù)期確認(rèn)需要的時(shí)間),從而效率要高的多。2、在輕權(quán)通信中,當(dāng)需要傳輸?shù)臄?shù)據(jù)量很小(可以裝在一個(gè)IP數(shù)據(jù)包內(nèi))時(shí)。如果我們使用TCP協(xié)議,那么,先建立連接,一共需要發(fā)送3個(gè)IP數(shù)據(jù)包,然后數(shù)據(jù)傳輸,1個(gè)IP數(shù)據(jù)包,產(chǎn)生一個(gè)確認(rèn)信號(hào)的IP包,然后關(guān)閉連接,需要傳輸5個(gè)IP數(shù)據(jù)包。使用TCP協(xié)議IP包的利用率為1/10。而使用UDP,只需要發(fā)送一個(gè)IP數(shù)據(jù)包。哪怕丟包(服務(wù)不成功),也可重新申請(qǐng)服務(wù)(重傳)。
UDP很適合這種客戶機(jī)向服務(wù)器傳送簡(jiǎn)單服務(wù)請(qǐng)求的環(huán)境。此類應(yīng)用層協(xié)議包括TFTP , SNMP , DNS ,DHCP等。
3、在對(duì)實(shí)時(shí)性要求很強(qiáng)的通信中:在諸如實(shí)時(shí)視頻直播等對(duì)實(shí)時(shí)性要求很高的環(huán)境中,從而允許一定量的丟包的情況下(直播比賽,前面丟失的包,重傳出來(lái)已經(jīng)意義不大了),UDP更適合。(可以根據(jù)具體需要通過(guò)應(yīng)用層協(xié)議提供可靠性,不用像TCP那么嚴(yán)格。)
適合TCP協(xié)議的環(huán)境:
當(dāng)網(wǎng)絡(luò)硬件失效或者負(fù)擔(dān)太重時(shí),數(shù)據(jù)包可能就會(huì)產(chǎn)生丟失、重復(fù)、延時(shí)、亂序的現(xiàn)象。這些都會(huì)導(dǎo)致我們的通信不正常的時(shí)候。如果讓?xiě)?yīng)用程序來(lái)?yè)?dān)負(fù)差錯(cuò)控制的工作,無(wú)疑將給程序員帶來(lái)許多復(fù)雜的工作,于是,我們使用獨(dú)立的通信協(xié)議來(lái)保證通信的可靠性是非常必要的。
-
端口
+關(guān)注
關(guān)注
4文章
988瀏覽量
32145 -
程序
+關(guān)注
關(guān)注
117文章
3795瀏覽量
81289 -
數(shù)據(jù)流
+關(guān)注
關(guān)注
0文章
121瀏覽量
14396 -
傳輸層
+關(guān)注
關(guān)注
0文章
30瀏覽量
10920
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論