欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1743|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

TCP/IP協(xié)議棧與數(shù)據(jù)包封裝

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:107189 發(fā)表于 2016-3-5 17:45 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
TCP/IP網(wǎng)絡(luò)協(xié)議棧分為應(yīng)用層(Application)、傳輸層(Transport)、網(wǎng)絡(luò)層(Network)和鏈路層(Link)四層。如下圖所示。
圖 36.1. TCP/IP協(xié)議棧




兩臺(tái)計(jì)算機(jī)通過TCP/IP協(xié)議通訊的過程如下所示(該圖出自[TCPIP])。
圖 36.2. TCP/IP通訊過程



傳輸層及其以下的機(jī)制由內(nèi)核提供,應(yīng)用層由用戶進(jìn)程提供(后面將介紹如何使用socket API編寫應(yīng)用程序),應(yīng)用程序?qū)νㄓ崝?shù)據(jù)的含義進(jìn)行解釋,而傳輸層及其以下處理通訊的細(xì)節(jié),將數(shù)據(jù)從一臺(tái)計(jì)算機(jī)通過一定的路徑發(fā)送到另一臺(tái)計(jì)算機(jī)。應(yīng)用層數(shù)據(jù)通過協(xié)議棧發(fā)到網(wǎng)絡(luò)上時(shí),每層協(xié)議都要加上一個(gè)數(shù)據(jù)首部(header),稱為封裝(Encapsulation),如下圖所示(該圖出自[TCPIP])。
圖 36.3. TCP/IP數(shù)據(jù)包的封裝



不同的協(xié)議層對(duì)數(shù)據(jù)包有不同的稱謂,在傳輸層叫做段(segment),在網(wǎng)絡(luò)層叫做數(shù)據(jù)報(bào)(datagram),在鏈路層叫做幀(frame)。數(shù)據(jù)封裝成幀后發(fā)到傳輸介質(zhì)上,到達(dá)目的主機(jī)后每層協(xié)議再剝掉相應(yīng)的首部,最后將應(yīng)用層數(shù)據(jù)交給應(yīng)用程序處理。
上圖對(duì)應(yīng)兩臺(tái)計(jì)算機(jī)在同一網(wǎng)段中的情況,如果兩臺(tái)計(jì)算機(jī)在不同的網(wǎng)段中,那么數(shù)據(jù)從一臺(tái)計(jì)算機(jī)到另一臺(tái)計(jì)算機(jī)傳輸過程中要經(jīng)過一個(gè)或多個(gè)路由器,如下圖所示(該圖出自[TCPIP])。
圖 36.4. 跨路由器通訊過程



其實(shí)在鏈路層之下還有物理層,指的是電信號(hào)的傳遞方式,比如現(xiàn)在以太網(wǎng)通用的網(wǎng)線(雙絞線)、早期以太網(wǎng)采用的的同軸電纜(現(xiàn)在主要用于有線電視)、光纖等都屬于物理層的概念。物理層的能力決定了最大傳輸速率、傳輸距離、抗干擾性等。集線器(Hub)是工作在物理層的網(wǎng)絡(luò)設(shè)備,用于雙絞線的連接和信號(hào)中繼(將已衰減的信號(hào)再次放大使之傳得更遠(yuǎn))。
鏈路層有以太網(wǎng)、令牌環(huán)網(wǎng)等標(biāo)準(zhǔn),鏈路層負(fù)責(zé)網(wǎng)卡設(shè)備的驅(qū)動(dòng)、幀同步(就是說從網(wǎng)線上檢測(cè)到什么信號(hào)算作新幀的開始)、沖突檢測(cè)(如果檢測(cè)到?jīng)_突就自動(dòng)重發(fā))、數(shù)據(jù)差錯(cuò)校驗(yàn)等工作。交換機(jī)是工作在鏈路層的網(wǎng)絡(luò)設(shè)備,可以在不同的鏈路層網(wǎng)絡(luò)之間轉(zhuǎn)發(fā)數(shù)據(jù)幀(比如十兆以太網(wǎng)和百兆以太網(wǎng)之間、以太網(wǎng)和令牌環(huán)網(wǎng)之間),由于不同鏈路層的幀格式不同,交換機(jī)要將進(jìn)來的數(shù)據(jù)包拆掉鏈路層首部重新封裝之后再轉(zhuǎn)發(fā)。
網(wǎng)絡(luò)層的IP協(xié)議是構(gòu)成Internet的基礎(chǔ)。Internet上的主機(jī)通過IP地址來標(biāo)識(shí),Internet上有大量路由器負(fù)責(zé)根據(jù)IP地址選擇合適的路徑轉(zhuǎn)發(fā)數(shù)據(jù)包,數(shù)據(jù)包從Internet上的源主機(jī)到目的主機(jī)往往要經(jīng)過十多個(gè)路由器。路由器是工作在第三層的網(wǎng)絡(luò)設(shè)備,同時(shí)兼有交換機(jī)的功能,可以在不同的鏈路層接口之間轉(zhuǎn)發(fā)數(shù)據(jù)包,因此路由器需要將進(jìn)來的數(shù)據(jù)包拆掉網(wǎng)絡(luò)層和鏈路層兩層首部并重新封裝。IP協(xié)議不保證傳輸?shù)目煽啃,?shù)據(jù)包在傳輸過程中可能丟失,可靠性可以在上層協(xié)議或應(yīng)用程序中提供支持。
網(wǎng)絡(luò)層負(fù)責(zé)點(diǎn)到點(diǎn)(point-to-point)的傳輸(這里的“點(diǎn)”指主機(jī)或路由器),而傳輸層負(fù)責(zé)端到端(end-to-end)的傳輸(這里的“端”指源主機(jī)和目的主機(jī))。傳輸層可選擇TCP或UDP協(xié)議。TCP是一種面向連接的、可靠的協(xié)議,有點(diǎn)像打電話,雙方拿起電話互通身份之后就建立了連接,然后說話就行了,這邊說的話那邊保證聽得到,并且是按說話的順序聽到的,說完話掛機(jī)斷開連接。也就是說TCP傳輸?shù)碾p方需要首先建立連接,之后由TCP協(xié)議保證數(shù)據(jù)收發(fā)的可靠性,丟失的數(shù)據(jù)包自動(dòng)重發(fā),上層應(yīng)用程序收到的總是可靠的數(shù)據(jù)流,通訊之后關(guān)閉連接。UDP協(xié)議不面向連接,也不保證可靠性,有點(diǎn)像寄信,寫好信放到郵筒里,既不能保證信件在郵遞過程中不會(huì)丟失,也不能保證信件是按順序寄到目的地的。使用UDP協(xié)議的應(yīng)用程序需要自己完成丟包重發(fā)、消息排序等工作。
目的主機(jī)收到數(shù)據(jù)包后,如何經(jīng)過各層協(xié)議棧最后到達(dá)應(yīng)用程序呢?整個(gè)過程如下圖所示(該圖出自[TCPIP])。
圖 36.5. Multiplexing過程



以太網(wǎng)驅(qū)動(dòng)程序首先根據(jù)以太網(wǎng)首部中的“上層協(xié)議”字段確定該數(shù)據(jù)幀的有效載荷(payload,指除去協(xié)議首部之外實(shí)際傳輸?shù)臄?shù)據(jù))是IP、ARP還是RARP協(xié)議的數(shù)據(jù)報(bào),然后交給相應(yīng)的協(xié)議處理。假如是IP數(shù)據(jù)報(bào),IP協(xié)議再根據(jù)IP首部中的“上層協(xié)議”字段確定該數(shù)據(jù)報(bào)的有效載荷是TCP、UDP、ICMP還是IGMP,然后交給相應(yīng)的協(xié)議處理。假如是TCP段或UDP段,TCP或UDP協(xié)議再根據(jù)TCP首部或UDP首部的“端口號(hào)”字段確定應(yīng)該將應(yīng)用層數(shù)據(jù)交給哪個(gè)用戶進(jìn)程。IP地址是標(biāo)識(shí)網(wǎng)絡(luò)中不同主機(jī)的地址,而端口號(hào)就是同一臺(tái)主機(jī)上標(biāo)識(shí)不同進(jìn)程的地址,IP地址和端口號(hào)合起來標(biāo)識(shí)網(wǎng)絡(luò)中唯一的進(jìn)程。
注意,雖然IP、ARP和RARP數(shù)據(jù)報(bào)都需要以太網(wǎng)驅(qū)動(dòng)程序來封裝成幀,但是從功能上劃分,ARP和RARP屬于鏈路層,IP屬于網(wǎng)絡(luò)層。雖然ICMP、IGMP、TCP、UDP的數(shù)據(jù)都需要IP協(xié)議來封裝成數(shù)據(jù)報(bào),但是從功能上劃分,ICMP、IGMP與IP同屬于網(wǎng)絡(luò)層,TCP和UDP屬于傳輸層。本文對(duì)RARP、ICMP、IGMP協(xié)議不做進(jìn)一步介紹,有興趣的讀者可以看參考資料。


2. 以太網(wǎng)(RFC 894)幀格式
以太網(wǎng)的幀格式如下所示(該圖出自[TCPIP]):
圖 36.6. 以太網(wǎng)幀格式



其中的源地址和目的地址是指網(wǎng)卡的硬件地址(也叫MAC地址),長度是48位,是在網(wǎng)卡出廠時(shí)固化的。用ifconfig命令看一下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。協(xié)議字段有三種值,分別對(duì)應(yīng)IP、ARP、RARP。幀末尾是CRC校驗(yàn)碼。
以太網(wǎng)幀中的數(shù)據(jù)長度規(guī)定最小46字節(jié),最大1500字節(jié),ARP和RARP數(shù)據(jù)包的長度不夠46字節(jié),要在后面補(bǔ)填充位。最大值1500稱為以太網(wǎng)的最大傳輸單元(MTU),不同的網(wǎng)絡(luò)類型有不同的MTU,如果一個(gè)數(shù)據(jù)包從以太網(wǎng)路由到撥號(hào)鏈路上,數(shù)據(jù)包長度大于撥號(hào)鏈路的MTU了,則需要對(duì)數(shù)據(jù)包進(jìn)行分片(fragmentation)。ifconfig命令的輸出中也有“MTU:1500”。注意,MTU這個(gè)概念指數(shù)據(jù)幀中有效載荷的最大長度,不包括幀首部的長度。



3. ARP數(shù)據(jù)報(bào)格式
在網(wǎng)絡(luò)通訊時(shí),源主機(jī)的應(yīng)用程序知道目的主機(jī)的IP地址和端口號(hào),卻不知道目的主機(jī)的硬件地址,而數(shù)據(jù)包首先是被網(wǎng)卡接收到再去處理上層協(xié)議的,如果接收到的數(shù)據(jù)包的硬件地址與本機(jī)不符,則直接丟棄。因此在通訊前必須獲得目的主機(jī)的硬件地址。ARP協(xié)議就起到這個(gè)作用。源主機(jī)發(fā)出ARP請(qǐng)求,詢問“IP地址是192.168.0.1的主機(jī)的硬件地址是多少”,并將這個(gè)請(qǐng)求廣播到本地網(wǎng)段(以太網(wǎng)幀首部的硬件地址填FF:FF:FF:FF:FF:FF表示廣播),目的主機(jī)接收到廣播的ARP請(qǐng)求,發(fā)現(xiàn)其中的IP地址與本機(jī)相符,則發(fā)送一個(gè)ARP應(yīng)答數(shù)據(jù)包給源主機(jī),將自己的硬件地址填寫在應(yīng)答包中。
每臺(tái)主機(jī)都維護(hù)一個(gè)ARP緩存表,可以用arp -a命令查看。緩存表中的表項(xiàng)有過期時(shí)間(一般為20分鐘),如果20分鐘內(nèi)沒有再次使用某個(gè)表項(xiàng),則該表項(xiàng)失效,下次還要發(fā)ARP請(qǐng)求來獲得目的主機(jī)的硬件地址。想一想,為什么表項(xiàng)要有過期時(shí)間而不是一直有效?
ARP數(shù)據(jù)報(bào)的格式如下所示(該圖出自[TCPIP]):
圖 36.7. ARP數(shù)據(jù)報(bào)格式



注意到源MAC地址、目的MAC地址在以太網(wǎng)首部和ARP請(qǐng)求中各出現(xiàn)一次,對(duì)于鏈路層為以太網(wǎng)的情況是多余的,但如果鏈路層是其它類型的網(wǎng)絡(luò)則有可能是必要的。硬件類型指鏈路層網(wǎng)絡(luò)類型,1為以太網(wǎng),協(xié)議類型指要轉(zhuǎn)換的地址類型,0x0800為IP地址,后面兩個(gè)地址長度對(duì)于以太網(wǎng)地址和IP地址分別為6和4(字節(jié)),op字段為1表示ARP請(qǐng)求,op字段為2表示ARP應(yīng)答。
下面舉一個(gè)具體的例子。
請(qǐng)求幀如下(為了清晰在每行的前面加了字節(jié)計(jì)數(shù),每行16個(gè)字節(jié)):
以太網(wǎng)首部(14字節(jié))
0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06
ARP幀(28字節(jié))
0000:                                            00 01
0010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 37
0020: 00 00 00 00 00 00 c0 a8 00 02
填充位(18字節(jié))
0020:                                00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00

以太網(wǎng)首部:目的主機(jī)采用廣播地址,源主機(jī)的MAC地址是00:05:5d:61:58:a8,上層協(xié)議類型0x0806表示ARP。
ARP幀:硬件類型0x0001表示以太網(wǎng),協(xié)議類型0x0800表示IP協(xié)議,硬件地址(MAC地址)長度為6,協(xié)議地址(IP地址)長度為4,op為0x0001表示請(qǐng)求目的主機(jī)的MAC地址,源主機(jī)MAC地址為00:05:5d:61:58:a8,源主機(jī)IP地址為c0 a8 00 37(192.168.0.55),目的主機(jī)MAC地址全0待填寫,目的主機(jī)IP地址為c0 a8 00 02(192.168.0.2)。
由于以太網(wǎng)規(guī)定最小數(shù)據(jù)長度為46字節(jié),ARP幀長度只有28字節(jié),因此有18字節(jié)填充位,填充位的內(nèi)容沒有定義,與具體實(shí)現(xiàn)相關(guān)。
應(yīng)答幀如下:
以太網(wǎng)首部
0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06
ARP幀
0000:                                            00 01
0010: 08 00 06 04 00 02 00 05 5d a1 b8 40 c0 a8 00 02
0020: 00 05 5d 61 58 a8 c0 a8 00 37
填充位
0020:                                00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00

以太網(wǎng)首部:目的主機(jī)的MAC地址是00:05:5d:61:58:a8,源主機(jī)的MAC地址是00:05:5d:a1:b8:40,上層協(xié)議類型0x0806表示ARP。
ARP幀:硬件類型0x0001表示以太網(wǎng),協(xié)議類型0x0800表示IP協(xié)議,硬件地址(MAC地址)長度為6,協(xié)議地址(IP地址)長度為4,op為0x0002表示應(yīng)答,源主機(jī)MAC地址為00:05:5d:a1:b8:40,源主機(jī)IP地址為c0 a8 00 02(192.168.0.2),目的主機(jī)MAC地址為00:05:5d:61:58:a8,目的主機(jī)IP地址為c0 a8 00 37(192.168.0.55)。
思考題:如果源主機(jī)和目的主機(jī)不在同一網(wǎng)段,ARP請(qǐng)求的廣播幀無法穿過路由器,源主機(jī)如何與目的主機(jī)通信?



4. IP數(shù)據(jù)報(bào)格式
IP數(shù)據(jù)報(bào)的格式如下(這里只討論IPv4)(該圖出自[TCPIP]):
圖 36.8. IP數(shù)據(jù)報(bào)格式



IP數(shù)據(jù)報(bào)的首部長度和數(shù)據(jù)長度都是可變長的,但總是4字節(jié)的整數(shù)倍。對(duì)于IPv4,4位版本字段是4。4位首部長度的數(shù)值是以4字節(jié)為單位的,最小值為5,也就是說首部長度最小是4x5=20字節(jié),也就是不帶任何選項(xiàng)的IP首部,4位能表示的最大值是15,也就是說首部長度最大是60字節(jié)。8位TOS字段有3個(gè)位用來指定IP數(shù)據(jù)報(bào)的優(yōu)先級(jí)(目前已經(jīng)廢棄不用),還有4個(gè)位表示可選的服務(wù)類型(最小延遲、最大呑吐量、最大可靠性、最小成本),還有一個(gè)位總是0?傞L度是整個(gè)數(shù)據(jù)報(bào)(包括IP首部和IP層payload)的字節(jié)數(shù)。每傳一個(gè)IP數(shù)據(jù)報(bào),16位的標(biāo)識(shí)加1,可用于分片和重新組裝數(shù)據(jù)報(bào)。3位標(biāo)志和13位片偏移用于分片。TTL(Time to live)是這樣用的:源主機(jī)為數(shù)據(jù)包設(shè)定一個(gè)生存時(shí)間,比如64,每過一個(gè)路由器就把該值減1,如果減到0就表示路由已經(jīng)太長了仍然找不到目的主機(jī)的網(wǎng)絡(luò),就丟棄該包,因此這個(gè)生存時(shí)間的單位不是秒,而是跳(hop)。協(xié)議字段指示上層協(xié)議是TCP、UDP、ICMP還是IGMP。然后是校驗(yàn)和,只校驗(yàn)IP首部,數(shù)據(jù)的校驗(yàn)由更高層協(xié)議負(fù)責(zé)。IPv4的IP地址長度為32位。選項(xiàng)字段的解釋從略。
想一想,前面講了以太網(wǎng)幀中的最小數(shù)據(jù)長度為46字節(jié),不足46字節(jié)的要用填充字節(jié)補(bǔ)上,那么如何界定這46字節(jié)里前多少個(gè)字節(jié)是IP、ARP或RARP數(shù)據(jù)報(bào)而后面是填充字節(jié)?



5. IP地址與路由
IPv4的IP地址長度為4字節(jié),通常采用點(diǎn)分十進(jìn)制表示法(dotted decimal representation)例如0xc0a80002表示為192.168.0.2。Internet被各種路由器和網(wǎng)關(guān)設(shè)備分隔成很多網(wǎng)段,為了標(biāo)識(shí)不同的網(wǎng)段,需要把32位的IP地址劃分成網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)兩部分,網(wǎng)絡(luò)號(hào)相同的各主機(jī)位于同一網(wǎng)段,相互間可以直接通信,網(wǎng)絡(luò)號(hào)不同的主機(jī)之間通信則需要通過路由器轉(zhuǎn)發(fā)。
過去曾經(jīng)提出一種劃分網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)的方案,把所有IP地址分為五類,如下圖所示(該圖出自[TCPIP])。
圖 36.9. IP地址類



A類 0.0.0.0到127.255.255.255
B類 128.0.0.0到191.255.255.255
C類 192.0.0.0到223.255.255.255
D類 224.0.0.0到239.255.255.255
E類 240.0.0.0到247.255.255.255

一個(gè)A類網(wǎng)絡(luò)可容納的地址數(shù)量最大,一個(gè)B類網(wǎng)絡(luò)的地址數(shù)量是65536,一個(gè)C類網(wǎng)絡(luò)的地址數(shù)量是256。D類地址用作多播地址,E類地址保留未用。
隨著Internet的飛速發(fā)展,這種劃分方案的局限性很快顯現(xiàn)出來,大多數(shù)組織都申請(qǐng)B類網(wǎng)絡(luò)地址,導(dǎo)致B類地址很快就分配完了,而A類卻浪費(fèi)了大量地址。這種方式對(duì)網(wǎng)絡(luò)的劃分是flat的而不是層級(jí)結(jié)構(gòu)(hierarchical)的,Internet上的每個(gè)路由器都必須掌握所有網(wǎng)絡(luò)的信息,隨著大量C類網(wǎng)絡(luò)的出現(xiàn),路由器需要檢索的路由表越來越龐大,負(fù)擔(dān)越來越重。
針對(duì)這種情況提出了新的劃分方案,稱為CIDR(Classless Interdomain Routing)。網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)的劃分需要用一個(gè)額外的子網(wǎng)掩碼(subnet mask)來表示,而不能由IP地址本身的數(shù)值決定,也就是說,網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)的劃分與這個(gè)IP地址是A類、B類還是C類無關(guān),因此稱為Classless的。這樣,多個(gè)子網(wǎng)就可以匯總(summarize)成一個(gè)Internet上的網(wǎng)絡(luò),例如,有8個(gè)站點(diǎn)都申請(qǐng)了C類網(wǎng)絡(luò),本來網(wǎng)絡(luò)號(hào)是24位的,但是這8個(gè)站點(diǎn)通過同一個(gè)ISP(Internet service provider)連到Internet上,它們網(wǎng)絡(luò)號(hào)的高21位是相同的,只有低三位不同,這8個(gè)站點(diǎn)就可以匯總,在Internet上只需要一個(gè)路由表項(xiàng),數(shù)據(jù)包通過Internet上的路由器到達(dá)ISP,然后在ISP這邊再通過次級(jí)的路由器選路到某個(gè)站點(diǎn)。
下面舉兩個(gè)例子:
表 36.1. 劃分子網(wǎng)的例子1
IP地址140.252.20.688C FC 14 44
子網(wǎng)掩碼255.255.255.0FF FF FF 00
網(wǎng)絡(luò)號(hào)140.252.20.08C FC 14 00
子網(wǎng)地址范圍140.252.20.0~140.252.20.255



表 36.2. 劃分子網(wǎng)的例子2
IP地址140.252.20.688C FC 14 44
子網(wǎng)掩碼255.255.255.240FF FF FF F0
網(wǎng)絡(luò)號(hào)140.252.20.648C FC 14 40
子網(wǎng)地址范圍140.252.20.64~140.252.20.79



可見,IP地址與子網(wǎng)掩碼做與運(yùn)算可以得到網(wǎng)絡(luò)號(hào),主機(jī)號(hào)從全0到全1就是子網(wǎng)的地址范圍。IP地址和子網(wǎng)掩碼還有一種更簡(jiǎn)潔的表示方法,例如140.252.20.68/24,表示IP地址為140.252.20.68,子網(wǎng)掩碼的高24位是1,也就是255.255.255.0。
如果一個(gè)組織內(nèi)部組建局域網(wǎng),IP地址只用于局域網(wǎng)內(nèi)的通信,而不直接連到Internet上,理論上使用任意的IP地址都可以,但是RFC 1918規(guī)定了用于組建局域網(wǎng)的私有IP地址,這些地址不會(huì)出現(xiàn)在Internet上,如下表所示。
  • 10.*,前8位是網(wǎng)絡(luò)號(hào),共16,777,216個(gè)地址
  • 172.16.*到172.31.*,前12位是網(wǎng)絡(luò)號(hào),共1,048,576個(gè)地址
  • 192.168.*,前16位是網(wǎng)絡(luò)號(hào),共65,536個(gè)地址


使用私有IP地址的局域網(wǎng)主機(jī)雖然沒有Internet的IP地址,但也可以通過代理服務(wù)器或NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換)等技術(shù)連到Internet上。
除了私有IP地址之外,還有幾種特殊的IP地址。127.*的IP地址用于本機(jī)環(huán)回(loop back)測(cè)試,通常是127.0.0.1。loopback是系統(tǒng)中一種特殊的網(wǎng)絡(luò)設(shè)備,如果發(fā)送數(shù)據(jù)包的目的地址是環(huán)回地址,或者與本機(jī)其它網(wǎng)絡(luò)設(shè)備的IP地址相同,則數(shù)據(jù)包不會(huì)發(fā)送到網(wǎng)絡(luò)介質(zhì)上,而是通過環(huán)回設(shè)備再發(fā)回給上層協(xié)議和應(yīng)用程序,主要用于測(cè)試。如下圖所示(該圖出自[TCPIP])。
圖 36.10. loopback設(shè)備



還有一些不能用作主機(jī)IP地址的特殊地址:
  • 目的地址為255.255.255.255,表示本網(wǎng)絡(luò)內(nèi)部廣播,路由器不轉(zhuǎn)發(fā)這樣的廣播數(shù)據(jù)包。
  • 主機(jī)號(hào)全為0的地址只表示網(wǎng)絡(luò)而不能表示某個(gè)主機(jī),如192.168.10.0(假設(shè)子網(wǎng)掩碼為255.255.255.0)。
  • 目的地址的主機(jī)號(hào)為全1,表示廣播至某個(gè)網(wǎng)絡(luò)的所有主機(jī),例如目的地址192.168.10.255表示廣播至192.168.10.0網(wǎng)絡(luò)(假設(shè)子網(wǎng)掩碼為255.255.255.0)。


下面介紹路由的過程,首先正式定義幾個(gè)名詞:
路由(名詞) 數(shù)據(jù)包從源地址到目的地址所經(jīng)過的路徑,由一系列路由節(jié)點(diǎn)組成。
路由(動(dòng)詞) 某個(gè)路由節(jié)點(diǎn)為數(shù)據(jù)報(bào)選擇投遞方向的選路過程。
路由節(jié)點(diǎn) 一個(gè)具有路由能力的主機(jī)或路由器,它維護(hù)一張路由表,通過查詢路由表來決定向哪個(gè)接口發(fā)送數(shù)據(jù)包。
接口 路由節(jié)點(diǎn)與某個(gè)網(wǎng)絡(luò)相連的網(wǎng)卡接口。
路由表 由很多路由條目組成,每個(gè)條目都指明去往某個(gè)網(wǎng)絡(luò)的數(shù)據(jù)包應(yīng)該經(jīng)由哪個(gè)接口發(fā)送,其中最后一條是缺省路由條目。
路由條目 路由表中的一行,每個(gè)條目主要由目的網(wǎng)絡(luò)地址、子網(wǎng)掩碼、下一跳地址、發(fā)送接口四部分組成,如果要發(fā)送的數(shù)據(jù)包的目的網(wǎng)絡(luò)地址匹配路由表中的某一行,就按規(guī)定的接口發(fā)送到下一跳地址。
缺省路由條目 路由表中的最后一行,主要由下一跳地址和發(fā)送接口兩部分組成,當(dāng)目的地址與路由表中其它行都不匹配時(shí),就按缺省路由條目規(guī)定的接口發(fā)送到下一跳地址。

假設(shè)某主機(jī)上的網(wǎng)絡(luò)接口配置和路由表如下:
$ ifconfigeth0      Link encap:Ethernet  HWaddr 00:0C:29:C2:8D:7E          inet addr:192.168.10.223  Bcast:192.168.10.255  Mask:255.255.255.0          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:0 errors:0 dropped:0 overruns:0 frame:0          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:100          RX bytes:0 (0.0 b)  TX bytes:420 (420.0 b)          Interrupt:10 Base address:0x10a0eth1      Link encap:Ethernet  HWaddr 00:0C:29:C2:8D:88          inet addr:192.168.56.136  Bcast:192.168.56.255  Mask:255.255.255.0          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:603 errors:0 dropped:0 overruns:0 frame:0          TX packets:110 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:100          RX bytes:55551 (54.2 Kb)  TX bytes:7601 (7.4 Kb)          Interrupt:9 Base address:0x10c0lo        Link encap:Local Loopback            inet addr:127.0.0.1  Mask:255.0.0.0          UP LOOPBACK RUNNING  MTU:16436  Metric:1          RX packets:37 errors:0 dropped:0 overruns:0 frame:0          TX packets:37 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:0           RX bytes:3020 (2.9 Kb)  TX bytes:3020 (2.9 Kb)$ routeKernel IP routing tableDestination     Gateway         Genmask         Flags Metric Ref    Use Iface192.168.10.0    *               255.255.255.0   U     0      0        0 eth0192.168.56.0    *               255.255.255.0   U     0      0        0 eth1127.0.0.0       *               255.0.0.0       U     0      0        0 lodefault         192.168.10.1    0.0.0.0         UG    0      0        0 eth0這臺(tái)主機(jī)有兩個(gè)網(wǎng)絡(luò)接口,一個(gè)網(wǎng)絡(luò)接口連到192.168.10.0/24網(wǎng)絡(luò),另一個(gè)網(wǎng)絡(luò)接口連到192.168.56.0/24網(wǎng)絡(luò)。路由表的Destination是目的網(wǎng)絡(luò)地址,Genmask是子網(wǎng)掩碼,Gateway是下一跳地址,Iface是發(fā)送接口,F(xiàn)lags中的U標(biāo)志表示此條目有效(可以禁用某些條目),G標(biāo)志表示此條目的下一跳地址是某個(gè)路由器的地址,沒有G標(biāo)志的條目表示目的網(wǎng)絡(luò)地址是與本機(jī)接口直接相連的網(wǎng)絡(luò),不必經(jīng)路由器轉(zhuǎn)發(fā),因此下一跳地址處記為*號(hào)。
如果要發(fā)送的數(shù)據(jù)包的目的地址是192.168.56.3,跟第一行的子網(wǎng)掩碼做與運(yùn)算得到192.168.56.0,與第一行的目的網(wǎng)絡(luò)地址不符,再跟第二行的子網(wǎng)掩碼做與運(yùn)算得到192.168.56.0,正是第二行的目的網(wǎng)絡(luò)地址,因此從eth1接口發(fā)送出去,由于192.168.56.0/24正是與eth1接口直接相連的網(wǎng)絡(luò),因此可以直接發(fā)到目的主機(jī),不需要經(jīng)路由器轉(zhuǎn)發(fā)。
如果要發(fā)送的數(shù)據(jù)包的目的地址是202.10.1.2,跟前三行路由表?xiàng)l目都不匹配,那么就要按缺省路由條目,從eth0接口發(fā)出去,首先發(fā)往192.168.10.1路由器,再讓路由器根據(jù)它的路由表決定下一跳地址。



6. UDP段格式
下圖是UDP的段格式(該圖出自[TCPIP])。
圖 36.11. UDP段格式



下面分析一幀基于UDP的TFTP協(xié)議幀。
以太網(wǎng)首部
0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00
IP首部
0000:                                            45 00
0010: 00 53 93 25 00 00 80 11 25 ec c0 a8 00 37 c0 a8
0020: 00 01
UDP首部
0020:       05 d4 00 45 00 3f ac 40
TFTP協(xié)議
0020:                                00 01 'c'':''\''q'
0030: 'w''e''r''q''.''q''w''e'00 'n''e''t''a''s''c''i'
0040: 'i'00 'b''l''k''s''i''z''e'00 '5''1''2'00 't''i'
0050: 'm''e''o''u''t'00 '1''0'00 't''s''i''z''e'00 '0'
0060: 00

以太網(wǎng)首部:源MAC地址是00:05:5d:61:58:a8,目的MAC地址是00:05:5d:67:d0:b1,上層協(xié)議類型0x0800表示IP。
IP首部:每一個(gè)字節(jié)0x45包含4位版本號(hào)和4位首部長度,版本號(hào)為4,即IPv4,首部長度為5,說明IP首部不帶有選項(xiàng)字段。服務(wù)類型為0,沒有使用服務(wù)。16位總長度字段(包括IP首部和IP層payload的長度)為0x0053,即83字節(jié),加上以太網(wǎng)首部14字節(jié)可知整個(gè)幀長度是97字節(jié)。IP報(bào)標(biāo)識(shí)是0x9325,標(biāo)志字段和片偏移字段設(shè)置為0x0000,就是DF=0允許分片,MF=0此數(shù)據(jù)報(bào)沒有更多分片,沒有分片偏移。TTL是0x80,也就是128。上層協(xié)議0x11表示UDP協(xié)議。IP首部校驗(yàn)和為0x25ec,源主機(jī)IP是c0 a8 00 37(192.168.0.55),目的主機(jī)IP是c0 a8 00 01(192.168.0.1)。
UDP首部:源端口號(hào)0x05d4(1492)是客戶端的端口號(hào),目的端口號(hào)0x0045(69)是TFTP服務(wù)的well-known端口號(hào)。UDP報(bào)長度為0x003f,即63字節(jié),包括UDP首部和UDP層payload的長度。UDP首部和UDP層payload的校驗(yàn)和為0xac40。
TFTP是基于文本的協(xié)議,各字段之間用字節(jié)0分隔,開頭的00 01表示請(qǐng)求讀取一個(gè)文件,接下來的各字段是:
c:\qwerq.qwe
netascii
blksize 512
timeout 10
tsize 0

一般的網(wǎng)絡(luò)通信都是像TFTP協(xié)議這樣,通信的雙方分別是客戶端和服務(wù)器,客戶端主動(dòng)發(fā)起請(qǐng)求(上面的例子就是客戶端發(fā)起的請(qǐng)求幀),而服務(wù)器被動(dòng)地等待、接收和應(yīng)答請(qǐng)求。客戶端的IP地址和端口號(hào)唯一標(biāo)識(shí)了該主機(jī)上的TFTP客戶端進(jìn)程,服務(wù)器的IP地址和端口號(hào)唯一標(biāo)識(shí)了該主機(jī)上的TFTP服務(wù)進(jìn)程,由于客戶端是主動(dòng)發(fā)起請(qǐng)求的一方,它必須知道服務(wù)器的IP地址和TFTP服務(wù)進(jìn)程的端口號(hào),所以,一些常見的網(wǎng)絡(luò)協(xié)議有默認(rèn)的服務(wù)器端口,例如HTTP服務(wù)默認(rèn)TCP協(xié)議的80端口,F(xiàn)TP服務(wù)默認(rèn)TCP協(xié)議的21端口,TFTP服務(wù)默認(rèn)UDP協(xié)議的69端口(如上例所示)。在使用客戶端程序時(shí),必須指定服務(wù)器的主機(jī)名或IP地址,如果不明確指定端口號(hào)則采用默認(rèn)端口,請(qǐng)讀者查閱ftp、tftp等程序的man page了解如何指定端口號(hào)。/etc/services中列出了所有well-known的服務(wù)端口和對(duì)應(yīng)的傳輸層協(xié)議,這是由IANA(Internet Assigned Numbers Authority)規(guī)定的,其中有些服務(wù)既可以用TCP也可以用UDP,為了清晰,IANA規(guī)定這樣的服務(wù)采用相同的TCP或UDP默認(rèn)端口號(hào),而另外一些TCP和UDP的相同端口號(hào)卻對(duì)應(yīng)不同的服務(wù)。
很多服務(wù)有well-known的端口號(hào),然而客戶端程序的端口號(hào)卻不必是well-known的,往往是每次運(yùn)行客戶端程序時(shí)由系統(tǒng)自動(dòng)分配一個(gè)空閑的端口號(hào),用完就釋放掉,稱為ephemeral的端口號(hào),想想這是為什么。
前面提過,UDP協(xié)議不面向連接,也不保證傳輸?shù)目煽啃,例如?br />
  • 發(fā)送端的UDP協(xié)議層只管把應(yīng)用層傳來的數(shù)據(jù)封裝成段交給IP協(xié)議層就算完成任務(wù)了,如果因?yàn)榫W(wǎng)絡(luò)故障該段無法發(fā)到對(duì)方,UDP協(xié)議層也不會(huì)給應(yīng)用層返回任何錯(cuò)誤信息。
  • 接收端的UDP協(xié)議層只管把收到的數(shù)據(jù)根據(jù)端口號(hào)交給相應(yīng)的應(yīng)用程序就算完成任務(wù)了,如果發(fā)送端發(fā)來多個(gè)數(shù)據(jù)包并且在網(wǎng)絡(luò)上經(jīng)過不同的路由,到達(dá)接收端時(shí)順序已經(jīng)錯(cuò)亂了,UDP協(xié)議層也不保證按發(fā)送時(shí)的順序交給應(yīng)用層。
  • 通常接收端的UDP協(xié)議層將收到的數(shù)據(jù)放在一個(gè)固定大小的緩沖區(qū)中等待應(yīng)用程序來提取和處理,如果應(yīng)用程序提取和處理的速度很慢,而發(fā)送端發(fā)送的速度很快,就會(huì)丟失數(shù)據(jù)包,UDP協(xié)議層并不報(bào)告這種錯(cuò)誤。


因此,使用UDP協(xié)議的應(yīng)用程序必須考慮到這些可能的問題并實(shí)現(xiàn)適當(dāng)?shù)慕鉀Q方案,例如等待應(yīng)答、超時(shí)重發(fā)、為數(shù)據(jù)包編號(hào)、流量控制等。一般使用UDP協(xié)議的應(yīng)用程序?qū)崿F(xiàn)都比較簡(jiǎn)單,只是發(fā)送一些對(duì)可靠性要求不高的消息,而不發(fā)送大量的數(shù)據(jù)。例如,基于UDP的TFTP協(xié)議一般只用于傳送小文件(所以才叫trivial的ftp),而基于TCP的FTP協(xié)議適用于各種文件的傳輸。下面看TCP協(xié)議如何用面向連接的服務(wù)來代替應(yīng)用程序解決傳輸?shù)目煽啃詥栴}。


7. TCP協(xié)議
7.1. 段格式
TCP的段格式如下圖所示(該圖出自[TCPIP])。
圖 36.12. TCP段格式



和UDP協(xié)議一樣也有源端口號(hào)和目的端口號(hào),通訊的雙方由IP地址和端口號(hào)標(biāo)識(shí)。32位序號(hào)、32位確認(rèn)序號(hào)、窗口大小稍后詳細(xì)解釋。4位首部長度和IP協(xié)議頭類似,表示TCP協(xié)議頭的長度,以4字節(jié)為單位,因此TCP協(xié)議頭最長可以是4x15=60字節(jié),如果沒有選項(xiàng)字段,TCP協(xié)議頭最短20字節(jié)。URG、ACK、PSH、RST、SYN、FIN是六個(gè)控制位,本節(jié)稍后將解釋SYN、ACK、FIN、RST四個(gè)位,其它位的解釋從略。16位檢驗(yàn)和將TCP協(xié)議頭和數(shù)據(jù)都計(jì)算在內(nèi)。緊急指針和各種選項(xiàng)的解釋從略。

7.2. 通訊時(shí)序 請(qǐng)點(diǎn)評(píng)


下圖是一次TCP通訊的時(shí)序圖。
圖 36.13. TCP連接建立斷開



在這個(gè)例子中,首先客戶端主動(dòng)發(fā)起連接、發(fā)送請(qǐng)求,然后服務(wù)器端響應(yīng)請(qǐng)求,然后客戶端主動(dòng)關(guān)閉連接。兩條豎線表示通訊的兩端,從上到下表示時(shí)間的先后順序,注意,數(shù)據(jù)從一端傳到網(wǎng)絡(luò)的另一端也需要時(shí)間,所以圖中的箭頭都是斜的。雙方發(fā)送的段按時(shí)間順序編號(hào)為1-10,各段中的主要信息在箭頭上標(biāo)出,例如段2的箭頭上標(biāo)著SYN, 8000(0), ACK 1001, <mss 1024>,表示該段中的SYN位置1,32位序號(hào)是8000,該段不攜帶有效載荷(數(shù)據(jù)字節(jié)數(shù)為0),ACK位置1,32位確認(rèn)序號(hào)是1001,帶有一個(gè)mss選項(xiàng)值為1024。
建立連接的過程:
  • 客戶端發(fā)出段1,SYN位表示連接請(qǐng)求。序號(hào)是1000,這個(gè)序號(hào)在網(wǎng)絡(luò)通訊中用作臨時(shí)的地址,每發(fā)一個(gè)數(shù)據(jù)字節(jié),這個(gè)序號(hào)要加1,這樣在接收端可以根據(jù)序號(hào)排出數(shù)據(jù)包的正確順序,也可以發(fā)現(xiàn)丟包的情況,另外,規(guī)定SYN位和FIN位也要占一個(gè)序號(hào),這次雖然沒發(fā)數(shù)據(jù),但是由于發(fā)了SYN位,因此下次再發(fā)送應(yīng)該用序號(hào)1001。mss表示最大段尺寸,如果一個(gè)段太大,封裝成幀后超過了鏈路層的最大幀長度,就必須在IP層分片,為了避免這種情況,客戶端聲明自己的最大段尺寸,建議服務(wù)器端發(fā)來的段不要超過這個(gè)長度。
  • 服務(wù)器發(fā)出段2,也帶有SYN位,同時(shí)置ACK位表示確認(rèn),確認(rèn)序號(hào)是1001,表示“我接收到序號(hào)1000及其以前所有的段,請(qǐng)你下次發(fā)送序號(hào)為1001的段”,也就是應(yīng)答了客戶端的連接請(qǐng)求,同時(shí)也給客戶端發(fā)出一個(gè)連接請(qǐng)求,同時(shí)聲明最大尺寸為1024。
  • 客戶端發(fā)出段3,對(duì)服務(wù)器的連接請(qǐng)求進(jìn)行應(yīng)答,確認(rèn)序號(hào)是8001。


在這個(gè)過程中,客戶端和服務(wù)器分別給對(duì)方發(fā)了連接請(qǐng)求,也應(yīng)答了對(duì)方的連接請(qǐng)求,其中服務(wù)器的請(qǐng)求和應(yīng)答在一個(gè)段中發(fā)出,因此一共有三個(gè)段用于建立連接,稱為'''三方握手(three-way-handshake)'''。在建立連接的同時(shí),雙方協(xié)商了一些信息,例如雙方發(fā)送序號(hào)的初始值、最大段尺寸等。
在TCP通訊中,如果一方收到另一方發(fā)來的段,讀出其中的目的端口號(hào),發(fā)現(xiàn)本機(jī)并沒有任何進(jìn)程使用這個(gè)端口,就會(huì)應(yīng)答一個(gè)包含RST位的段給另一方。例如,服務(wù)器并沒有任何進(jìn)程使用8080端口,我們卻用telnet客戶端去連接它,服務(wù)器收到客戶端發(fā)來的SYN段就會(huì)應(yīng)答一個(gè)RST段,客戶端的telnet程序收到RST段后報(bào)告錯(cuò)誤Connection refused:
$ telnet 192.168.0.200 8080Trying 192.168.0.200...telnet: Unable to connect to remote host: Connection refused數(shù)據(jù)傳輸?shù)倪^程:
  • 客戶端發(fā)出段4,包含從序號(hào)1001開始的20個(gè)字節(jié)數(shù)據(jù)。
  • 服務(wù)器發(fā)出段5,確認(rèn)序號(hào)為1021,對(duì)序號(hào)為1001-1020的數(shù)據(jù)表示確認(rèn)收到,同時(shí)請(qǐng)求發(fā)送序號(hào)1021開始的數(shù)據(jù),服務(wù)器在應(yīng)答的同時(shí)也向客戶端發(fā)送從序號(hào)8001開始的10個(gè)字節(jié)數(shù)據(jù),這稱為piggyback。
  • 客戶端發(fā)出段6,對(duì)服務(wù)器發(fā)來的序號(hào)為8001-8010的數(shù)據(jù)表示確認(rèn)收到,請(qǐng)求發(fā)送序號(hào)8011開始的數(shù)據(jù)。


在數(shù)據(jù)傳輸過程中,ACK和確認(rèn)序號(hào)是非常重要的,應(yīng)用程序交給TCP協(xié)議發(fā)送的數(shù)據(jù)會(huì)暫存在TCP層的發(fā)送緩沖區(qū)中,發(fā)出數(shù)據(jù)包給對(duì)方之后,只有收到對(duì)方應(yīng)答的ACK段才知道該數(shù)據(jù)包確實(shí)發(fā)到了對(duì)方,可以從發(fā)送緩沖區(qū)中釋放掉了,如果因?yàn)榫W(wǎng)絡(luò)故障丟失了數(shù)據(jù)包或者丟失了對(duì)方發(fā)回的ACK段,經(jīng)過等待超時(shí)后TCP協(xié)議自動(dòng)將發(fā)送緩沖區(qū)中的數(shù)據(jù)包重發(fā)。
這個(gè)例子只描述了最簡(jiǎn)單的一問一答的情景,實(shí)際的TCP數(shù)據(jù)傳輸過程可以收發(fā)很多數(shù)據(jù)段,雖然典型的情景是客戶端主動(dòng)請(qǐng)求服務(wù)器被動(dòng)應(yīng)答,但也不是必須如此,事實(shí)上TCP協(xié)議為應(yīng)用層提供了全雙工(full-duplex)的服務(wù),雙方都可以主動(dòng)甚至同時(shí)給對(duì)方發(fā)送數(shù)據(jù)。
如果通訊過程只能采用一問一答的方式,收和發(fā)兩個(gè)方向不能同時(shí)傳輸,在同一時(shí)間只允許一個(gè)方向的數(shù)據(jù)傳輸,則稱為'''半雙工(half-duplex)''',假設(shè)某種面向連接的協(xié)議是半雙工的,則只需要一套序號(hào)就夠了,不需要通訊雙方各自維護(hù)一套序號(hào),想一想為什么。
關(guān)閉連接的過程:
  • 客戶端發(fā)出段7,F(xiàn)IN位表示關(guān)閉連接的請(qǐng)求。
  • 服務(wù)器發(fā)出段8,應(yīng)答客戶端的關(guān)閉連接請(qǐng)求。
  • 服務(wù)器發(fā)出段9,其中也包含F(xiàn)IN位,向客戶端發(fā)送關(guān)閉連接請(qǐng)求。
  • 客戶端發(fā)出段10,應(yīng)答服務(wù)器的關(guān)閉連接請(qǐng)求。


建立連接的過程是三方握手,而關(guān)閉連接通常需要4個(gè)段,服務(wù)器的應(yīng)答和關(guān)閉連接請(qǐng)求通常不合并在一個(gè)段中,因?yàn)橛羞B接半關(guān)閉的情況,這種情況下客戶端關(guān)閉連接之后就不能再發(fā)送數(shù)據(jù)給服務(wù)器了,但是服務(wù)器還可以發(fā)送數(shù)據(jù)給客戶端,直到服務(wù)器也關(guān)閉連接為止,稍后會(huì)看到這樣的例子。

7.3. 流量控制 請(qǐng)點(diǎn)評(píng)


介紹UDP時(shí)我們描述了這樣的問題:如果發(fā)送端發(fā)送的速度較快,接收端接收到數(shù)據(jù)后處理的速度較慢,而接收緩沖區(qū)的大小是固定的,就會(huì)丟失數(shù)據(jù)。TCP協(xié)議通過'''滑動(dòng)窗口(Sliding Window)'''機(jī)制解決這一問題。看下圖的通訊過程。
圖 36.14. 滑動(dòng)窗口



  • 發(fā)送端發(fā)起連接,聲明最大段尺寸是1460,初始序號(hào)是0,窗口大小是4K,表示“我的接收緩沖區(qū)還有4K字節(jié)空閑,你發(fā)的數(shù)據(jù)不要超過4K”。接收端應(yīng)答連接請(qǐng)求,聲明最大段尺寸是1024,初始序號(hào)是8000,窗口大小是6K。發(fā)送端應(yīng)答,三方握手結(jié)束。
  • 發(fā)送端發(fā)出段4-9,每個(gè)段帶1K的數(shù)據(jù),發(fā)送端根據(jù)窗口大小知道接收端的緩沖區(qū)滿了,因此停止發(fā)送數(shù)據(jù)。
  • 接收端的應(yīng)用程序提走2K數(shù)據(jù),接收緩沖區(qū)又有了2K空閑,接收端發(fā)出段10,在應(yīng)答已收到6K數(shù)據(jù)的同時(shí)聲明窗口大小為2K。
  • 接收端的應(yīng)用程序又提走2K數(shù)據(jù),接收緩沖區(qū)有4K空閑,接收端發(fā)出段11,重新聲明窗口大小為4K。
  • 發(fā)送端發(fā)出段12-13,每個(gè)段帶2K數(shù)據(jù),段13同時(shí)還包含F(xiàn)IN位。
  • 接收端應(yīng)答接收到的2K數(shù)據(jù)(6145-8192),再加上FIN位占一個(gè)序號(hào)8193,因此應(yīng)答序號(hào)是8194,連接處于半關(guān)閉狀態(tài),接收端同時(shí)聲明窗口大小為2K。
  • 接收端的應(yīng)用程序提走2K數(shù)據(jù),接收端重新聲明窗口大小為4K。
  • 接收端的應(yīng)用程序提走剩下的2K數(shù)據(jù),接收緩沖區(qū)全空,接收端重新聲明窗口大小為6K。
  • 接收端的應(yīng)用程序在提走全部數(shù)據(jù)后,決定關(guān)閉連接,發(fā)出段17包含F(xiàn)IN位,發(fā)送端應(yīng)答,連接完全關(guān)閉。


上圖在接收端用小方塊表示1K數(shù)據(jù),實(shí)心的小方塊表示已接收到的數(shù)據(jù),虛線框表示接收緩沖區(qū),因此套在虛線框中的空心小方塊表示窗口大小,從圖中可以看出,隨著應(yīng)用程序提走數(shù)據(jù),虛線框是向右滑動(dòng)的,因此稱為滑動(dòng)窗口。
從這個(gè)例子還可以看出,發(fā)送端是一K一K地發(fā)送數(shù)據(jù),而接收端的應(yīng)用程序可以兩K兩K地提走數(shù)據(jù),當(dāng)然也有可能一次提走3K或6K數(shù)據(jù),或者一次只提走幾個(gè)字節(jié)的數(shù)據(jù),也就是說,應(yīng)用程序所看到的數(shù)據(jù)是一個(gè)整體,或說是一個(gè)流(stream),在底層通訊中這些數(shù)據(jù)可能被拆成很多數(shù)據(jù)包來發(fā)送,但是一個(gè)數(shù)據(jù)包有多少字節(jié)對(duì)應(yīng)用程序是不可見的,因此TCP協(xié)議是面向流的協(xié)議。而UDP是面向消息的協(xié)議,每個(gè)UDP段都是一條消息,應(yīng)用程序必須以消息為單位提取數(shù)據(jù),不能一次提取任意字節(jié)的數(shù)據(jù),這一點(diǎn)和TCP是很不同的。




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表