TCP/IP協議棧與資料包封裝
TCP/IP網路協議棧分為應用層(Application)、傳輸層(Transport)、網路層(Network)和鏈路層(Link)四層。如下圖所示
圖 36.1. TCP/IP協議棧
兩臺計算機通過TCP/IP協議通訊的過程如下所示
圖 36.2. TCP/IP通訊過程
傳輸層及其以下的機制由核心提供,應用層由使用者程序提供(後面將介紹如何使用socket API編寫應用程式),應用程式對通訊資料的含義進行解釋,而傳輸層及其以下處理通訊的細節,將資料從一臺計算機通過一定的路徑傳送到另一臺計算機。應用層資料通過協議棧發到網路上時,每層協議都要加上一個資料首部(header),稱為封裝(Encapsulation),如下圖所示
圖 36.3. TCP/IP資料包的封裝
不同的協議層對資料包有不同的稱謂,在傳輸層叫做段(segment),在網路層叫做資料報(datagram),在鏈路層叫做幀(frame)。資料封裝成幀後發到傳輸介質上,到達目的主機後每層協議再剝掉相應的首部,最後將應用層資料交給應用程式處理。
上圖對應兩臺計算機在同一網段中的情況,如果兩臺計算機在不同的網段中,那麼資料從一臺計算機到另一臺計算機傳輸過程中要經過一個或多個路由器,如下圖所示
圖 36.4. 跨路由器通訊過程
其實在鏈路層之下還有物理層,指的是電訊號的傳遞方式,比如現在乙太網通用的網線(雙絞線)、早期乙太網採用的的同軸電纜(現在主要用於有線電視)、光纖等都屬於物理層的概念。物理層的能力決定了最大傳輸速率、傳輸距離、抗干擾性等。集線器(Hub)是工作在物理層的網路裝置,用於雙絞線的連線和訊號中繼(將已衰減的訊號再次放大使之傳得更遠)。
鏈路層有乙太網、令牌環網等標準,鏈路層負責網絡卡裝置的驅動、幀同步(就是說從網線上檢測到什麼訊號算作新幀的開始)、衝突檢測(如果檢測到衝突就自動重發)、資料差錯校驗等工作。交換機是工作在鏈路層的網路裝置,可以在不同的鏈路層網路之間轉發資料幀(比如十兆乙太網和百兆乙太網之間、乙太網和令牌環網之間),由於不同鏈路層的幀格式不同,交換機要將進來的資料包拆掉鏈路層首部重新封裝之後再轉發。
網路層的IP協議是構成Internet的基礎。Internet上的主機通過IP地址來標識,Internet上有大量路由器負責根據IP地址選擇合適的路徑轉發資料包,資料包從Internet上的源主機到目的主機往往要經過十多個路由器。路由器是工作在第三層的網路裝置,同時兼有交換機的功能,可以在不同的鏈路層介面之間轉發資料包,因此路由器需要將進來的資料包拆掉網路層和鏈路層兩層首部並重新封裝。IP協議不保證傳輸的可靠性,資料包在傳輸過程中可能丟失,可靠性可以在上層協議或應用程式中提供支援。
網路層負責點到點(point-to-point)的傳輸(這裡的“點”指主機或路由器),而傳輸層負責端到端(end-to-end)的傳輸(這裡的“端”指源主機和目的主機)。傳輸層可選擇TCP或UDP協議。TCP是一種面向連線的、可靠的協議,有點像打電話,雙方拿起電話互通身份之後就建立了連線,然後說話就行了,這邊說的話那邊保證聽得到,並且是按說話的順序聽到的,說完話掛機斷開連線。也就是說TCP 傳輸的雙方需要首先建立連線,之後由TCP協議保證資料收發的可靠性,丟失的資料包自動重發,上層應用程式收到的總是可靠的資料流,通訊之後關閉連線。 UDP協議不面向連線,也不保證可靠性,有點像寄信,寫好信放到郵筒裡,既不能保證信件在郵遞過程中不會丟失,也不能保證信件是按順序寄到目的地的。使用 UDP協議的應用程式需要自己完成丟包重發、訊息排序等工作。
目的主機收到資料包後,如何經過各層協議棧最後到達應用程式呢?整個過程如下圖所示
圖 36.5. Multiplexing過程
乙太網驅動程式首先根據乙太網首部中的“上層協議”欄位確定該資料幀的有效載荷(payload,指除去協議首部之外實際傳輸的資料)是IP、ARP還是RARP協議的資料報,然後交給相應的協議處理。假如是IP資料報,IP協議再根據IP首部中的“上層協議”欄位確定該資料報的有效載荷是TCP、UDP、ICMP還是IGMP,然後交給相應的協議處理。假如是TCP段或UDP段,TCP或UDP協議再根據TCP首部或 UDP首部的“埠號”欄位確定應該將應用層資料交給哪個使用者程序。IP地址是標識網路中不同主機的地址,而埠號就是同一臺主機上標識不同程序的地址,IP地址和埠號合起來標識網路中唯一的程序。
注意,雖然IP、ARP和RARP資料報都需要乙太網驅動程式來封裝成幀,但是從功能上劃分,ARP和RARP屬於鏈路層,IP屬於網路層。雖然ICMP、IGMP、TCP、UDP的資料都需要IP協議來封裝成資料報,但是從功能上劃分,ICMP、IGMP與IP同屬於網路層,TCP和UDP屬於傳輸層。本文對RARP、ICMP、IGMP協議不做進一步介紹,有興趣的讀者可以看參考資料。
2. 乙太網(RFC 894)幀格式
乙太網的幀格式如下所示
圖 36.6. 乙太網幀格式
其中的源地址和目的地址是指網絡卡的硬體地址(也叫MAC地址),長度是48位,是在網絡卡出廠時固化的。用ifconfig命令看一下,“HWaddr 00:15:F2:14:9E:3F”部分就是硬體地址。協議欄位有三種值,分別對應IP、ARP、RARP。幀末尾是CRC校驗碼。
乙太網幀中的資料長度規定最小46位元組,最大1500位元組,ARP和RARP資料包的長度不夠46位元組,要在後面補填充位。最大值1500稱為乙太網的最大傳輸單元(MTU),不同的網路型別有不同的MTU,如果一個數據包從乙太網路由到撥號鏈路上,資料包長度大於撥號鏈路的MTU了,則需要對資料包進行分片(fragmentation)。ifconfig命令的輸出中也有“MTU:1500”。注意,MTU這個概念指資料幀中有效載荷的最大長度,不包括幀首部的長度。
3. ARP資料報格式
在網路通訊時,源主機的應用程式知道目的主機的IP地址和埠號,卻不知道目的主機的硬體地址,而資料包首先是被網絡卡接收到再去處理上層協議的,如果接收到的資料包的硬體地址與本機不符,則直接丟棄。因此在通訊前必須獲得目的主機的硬體地址。ARP協議就起到這個作用。源主機發出ARP請求,詢問 “IP地址是192.168.0.1的主機的硬體地址是多少”,並將這個請求廣播到本地網段(乙太網幀首部的硬體地址填 FF:FF:FF:FF:FF:FF表示廣播),目的主機接收到廣播的ARP請求,發現其中的IP地址與本機相符,則傳送一個ARP應答資料包給源主機,將自己的硬體地址填寫在應答包中。
每臺主機都維護一個ARP快取表,可以用arp -a命令檢視。快取表中的表項有過期時間(一般為20分鐘),如果20分鐘內沒有再次使用某個表項,則該表項失效,下次還要發ARP請求來獲得目的主機的硬體地址。想一想,為什麼表項要有過期時間而不是一直有效?
ARP資料報的格式如下所示
圖 36.7. ARP資料報格式
注意到源MAC地址、目的MAC地址在乙太網首部和ARP請求中各出現一次,對於鏈路層為乙太網的情況是多餘的,但如果鏈路層是其它型別的網路則有可能是必要的。硬體型別指鏈路層網路型別,1為乙太網,協議型別指要轉換的地址型別,0x0800為IP地址,後面兩個地址長度對於乙太網地址和IP地址分別為6和4(位元組),op欄位為1表示ARP請求,op欄位為2表示ARP應答。
下面舉一個具體的例子。
請求幀如下(為了清晰在每行的前面加了位元組計數,每行16個位元組):
乙太網首部(14位元組)
0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06
ARP幀(28位元組)
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位元組)
0020: 00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00
乙太網首部:目的主機採用廣播地址,源主機的MAC地址是00:05:5d:61:58:a8,上層協議型別0x0806表示ARP。
ARP幀:硬體型別0x0001表示乙太網,協議型別0x0800表示IP協議,硬體地址(MAC地址)長度為6,協議地址(IP地址)長度為 4,op為0x0001表示請求目的主機的MAC地址,源主機MAC地址為00:05:5d:61:58:a8,源主機IP地址為c0 a8 00 37(192.168.0.55),目的主機MAC地址全0待填寫,目的主機IP地址為c0 a8 00 02(192.168.0.2)。
由於乙太網規定最小資料長度為46位元組,ARP幀長度只有28位元組,因此有18位元組填充位,填充位的內容沒有定義,與具體實現相關。
應答幀如下:
乙太網首部
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
乙太網首部:目的主機的MAC地址是00:05:5d:61:58:a8,源主機的MAC地址是00:05:5d:a1:b8:40,上層協議型別0x0806表示ARP。
ARP幀:硬體型別0x0001表示乙太網,協議型別0x0800表示IP協議,硬體地址(MAC地址)長度為6,協議地址(IP地址)長度為 4,op為0x0002表示應答,源主機MAC地址為00:05:5d:a1:b8:40,源主機IP地址為c0 a8 00 02(192.168.0.2),目的主機MAC地址為00:05:5d:61:58:a8,目的主機IP地址為c0 a8 00 37(192.168.0.55)。
思考題:如果源主機和目的主機不在同一網段,ARP請求的廣播幀無法穿過路由器,源主機如何與目的主機通訊?
4. IP資料報格式
IP資料報的格式如下(這裡只討論IPv4)
圖 36.8. IP資料報格式
IP資料報的首部長度和資料長度都是可變長的,但總是4位元組的整數倍。對於IPv4,4位版本欄位是4。4位首部長度的數值是以4位元組為單位的,最小值為5,也就是說首部長度最小是4x5=20位元組,也就是不帶任何選項的IP首部,4位能表示的最大值是15,也就是說首部長度最大是60位元組。8位 TOS欄位有3個位用來指定IP資料報的優先順序(目前已經廢棄不用),還有4個位表示可選的服務型別(最小延遲、最大呑吐量、最大可靠性、最小成本),還有一個位總是0。總長度是整個資料報(包括IP首部和IP層payload)的位元組數。每傳一個IP資料報,16位的標識加1,可用於分片和重新組裝資料報。3位標誌和13位片偏移用於分片。TTL(Time to live)是這樣用的:源主機為資料包設定一個生存時間,比如64,每過一個路由器就把該值減1,如果減到0就表示路由已經太長了仍然找不到目的主機的網路,就丟棄該包,因此這個生存時間的單位不是秒,而是跳(hop)。協議欄位指示上層協議是TCP、UDP、ICMP還是IGMP。然後是校驗和,只校驗 IP首部,資料的校驗由更高層協議負責。IPv4的IP地址長度為32位。選項欄位的解釋從略。
想一想,前面講了乙太網幀中的最小資料長度為46位元組,不足46位元組的要用填充位元組補上,那麼如何界定這46位元組裡前多少個位元組是IP、ARP或RARP資料報而後面是填充位元組?
5. IP地址與路由
IPv4的IP地址長度為4位元組,通常採用點分十進位制表示法(dotted decimal representation)例如0xc0a80002表示為192.168.0.2。Internet被各種路由器和閘道器裝置分隔成很多網段,為了標識不同的網段,需要把32位的IP地址劃分成網路號和主機號兩部分,網路號相同的各主機位於同一網段,相互間可以直接通訊,網路號不同的主機之間通訊則需要通過路由器轉發。
過去曾經提出一種劃分網路號和主機號的方案,把所有IP地址分為五類,如下圖所示
圖 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
一個A類網路可容納的地址數量最大,一個B類網路的地址數量是65536,一個C類網路的地址數量是256。D類地址用作多播地址,E類地址保留未用。
隨著Internet的飛速發展,這種劃分方案的侷限性很快顯現出來,大多陣列織都申請B類網路地址,導致B類地址很快就分配完了,而A類卻浪費了大量地址。這種方式對網路的劃分是flat的而不是層級結構(hierarchical)的,Internet上的每個路由器都必須掌握所有網路的資訊,隨著大量C類網路的出現,路由器需要檢索的路由表越來越龐大,負擔越來越重。
針對這種情況提出了新的劃分方案,稱為CIDR(Classless Interdomain Routing)。網路號和主機號的劃分需要用一個額外的子網掩碼(subnet mask)來表示,而不能由IP地址本身的數值決定,也就是說,網路號和主機號的劃分與這個IP地址是A類、B類還是C類無關,因此稱為 Classless的。這樣,多個子網就可以彙總(summarize)成一個Internet上的網路,例如,有8個站點都申請了C類網路,本來網路號是24位的,但是這8個站點通過同一個ISP(Internet service provider)連到Internet上,它們網路號的高21位是相同的,只有低三位不同,這8個站點就可以彙總,在Internet上只需要一個路由表項,資料包通過Internet上的路由器到達ISP,然後在ISP這邊再通過次級的路由器選路到某個站點。
下面舉兩個例子:
表 36.1. 劃分子網的例子1
IP地址140.252.20.688C FC 14 44子網掩碼255.255.255.0FF FF FF 00網路號140.252.20.08C FC 14 00子網地址範圍140.252.20.0~140.252.20.255
表 36.2. 劃分子網的例子2
IP地址140.252.20.688C FC 14 44子網掩碼255.255.255.240FF FF FF F0網路號140.252.20.648C FC 14 40子網地址範圍140.252.20.64~140.252.20.79
可見,IP地址與子網掩碼做與運算可以得到網路號,主機號從全0到全1就是子網的地址範圍。IP地址和子網掩碼還有一種更簡潔的表示方法,例如 140.252.20.68/24,表示IP地址為140.252.20.68,子網掩碼的高24位是1,也就是255.255.255.0。
如果一個組織內部組建區域網,IP地址只用於區域網內的通訊,而不直接連到Internet上,理論上使用任意的IP地址都可以,但是RFC 1918規定了用於組建區域網的私有IP地址,這些地址不會出現在Internet上,如下表所示。
10.*,前8位是網路號,共16,777,216個地址
172.16.*到172.31.*,前12位是網路號,共1,048,576個地址
192.168.*,前16位是網路號,共65,536個地址
使用私有IP地址的區域網主機雖然沒有Internet的IP地址,但也可以通過代理伺服器或NAT(網路地址轉換)等技術連到Internet上。
除了私有IP地址之外,還有幾種特殊的IP地址。127.*的IP地址用於本機環回(loop back)測試,通常是127.0.0.1。loopback是系統中一種特殊的網路裝置,如果傳送資料包的目的地址是環回地址,或者與本機其它網路裝置的IP地址相同,則資料包不會發送到網路介質上,而是通過環回裝置再發回給上層協議和應用程式,主要用於測試。如下圖所示
圖 36.10. loopback裝置
還有一些不能用作主機IP地址的特殊地址:
目的地址為255.255.255.255,表示本網路內部廣播,路由器不轉發這樣的廣播資料包。
主機號全為0的地址只表示網路而不能表示某個主機,如192.168.10.0(假設子網掩碼為255.255.255.0)。
目的地址的主機號為全1,表示廣播至某個網路的所有主機,例如目的地址192.168.10.255表示廣播至192.168.10.0網路(假設子網掩碼為255.255.255.0)。
下面介紹路由的過程,首先正式定義幾個名詞:
路由(名詞) 資料包從源地址到目的地址所經過的路徑,由一系列路由節點組成。
路由(動詞) 某個路由節點為資料報選擇投遞方向的選路過程。
路由節點 一個具有路由能力的主機或路由器,它維護一張路由表,通過查詢路由表來決定向哪個介面傳送資料包。
介面 路由節點與某個網路相連的網絡卡介面。
路由表 由很多路由條目組成,每個條目都指明去往某個網路的資料包應該經由哪個介面傳送,其中最後一條是預設路由條目。
路由條目 路由表中的一行,每個條目主要由目的網路地址、子網掩碼、下一跳地址、傳送介面四部分組成,如果要傳送的資料包的目的網路地址匹配路由表中的某一行,就按規定的介面傳送到下一跳地址。
預設路由條目 路由表中的最後一行,主要由下一跳地址和傳送介面兩部分組成,當目的地址與路由表中其它行都不匹配時,就按預設路由條目規定的介面傳送到下一跳地址。
假設某主機上的網路介面配置和路由表如下:
$ ifconfig
eth0 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:0x10a0
eth1 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:0x10c0
lo 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)
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.10.0 * 255.255.255.0 U 0 0 0 eth0
192.168.56.0 * 255.255.255.0 U 0 0 0 eth1
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default 192.168.10.1 0.0.0.0 UG 0 0 0 eth0這臺主機有兩個網路介面,一個網路介面連到192.168.10.0/24網路,另一個網路介面連到192.168.56.0/24網路。路由表的 Destination是目的網路地址,Genmask是子網掩碼,Gateway是下一跳地址,Iface是傳送介面,Flags中的U標誌表示此條目有效(可以禁用某些條目),G標誌表示此條目的下一跳地址是某個路由器的地址,沒有G標誌的條目表示目的網路地址是與本機介面直接相連的網路,不必經路由器轉發,因此下一跳地址處記為*號。
如果要傳送的資料包的目的地址是192.168.56.3,跟第一行的子網掩碼做與運算得到192.168.56.0,與第一行的目的網路地址不符,再跟第二行的子網掩碼做與運算得到192.168.56.0,正是第二行的目的網路地址,因此從eth1介面傳送出去,由於 192.168.56.0/24正是與eth1介面直接相連的網路,因此可以直接發到目的主機,不需要經路由器轉發。
如果要傳送的資料包的目的地址是202.10.1.2,跟前三行路由表條目都不匹配,那麼就要按預設路由條目,從eth0介面發出去,首先發往192.168.10.1路由器,再讓路由器根據它的路由表決定下一跳地址。
6. UDP段格式
下圖是UDP的段格式
圖 36.11. UDP段格式
下面分析一幀基於UDP的TFTP協議幀。
乙太網首部
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協議
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
乙太網首部:源MAC地址是00:05:5d:61:58:a8,目的MAC地址是00:05:5d:67:d0:b1,上層協議型別0x0800表示IP。
IP首部:每一個位元組0x45包含4位版本號和4位首部長度,版本號為4,即IPv4,首部長度為5,說明IP首部不帶有選項欄位。服務型別為0,沒有使用服務。16位總長度欄位(包括IP首部和IP層payload的長度)為0x0053,即83位元組,加上乙太網首部14位元組可知整個幀長度是97 位元組。IP報標識是0x9325,標誌欄位和片偏移欄位設定為0x0000,就是DF=0允許分片,MF=0此資料報沒有更多分片,沒有分片偏移。TTL 是0x80,也就是128。上層協議0x11表示UDP協議。IP首部校驗和為0x25ec,源主機IP是c0 a8 00 37(192.168.0.55),目的主機IP是c0 a8 00 01(192.168.0.1)。
UDP首部:源埠號0x05d4(1492)是客戶端的埠號,目的埠號0x0045(69)是TFTP服務的well-known埠號。 UDP報長度為0x003f,即63位元組,包括UDP首部和UDP層payload的長度。UDP首部和UDP層payload的校驗和為0xac40。
TFTP是基於文字的協議,各欄位之間用位元組0分隔,開頭的00 01表示請求讀取一個檔案,接下來的各欄位是:
c:\qwerq.qwe
netascii
blksize 512
timeout 10
tsize 0
一般的網路通訊都是像TFTP協議這樣,通訊的雙方分別是客戶端和伺服器,客戶端主動發起請求(上面的例子就是客戶端發起的請求幀),而伺服器被動地等待、接收和應答請求。客戶端的IP地址和埠號唯一標識了該主機上的TFTP客戶端程序,伺服器的IP地址和埠號唯一標識了該主機上的TFTP服務程序,由於客戶端是主動發起請求的一方,它必須知道伺服器的IP地址和TFTP服務程序的埠號,所以,一些常見的網路協議有預設的伺服器埠,例如 HTTP服務預設TCP協議的80埠,FTP服務預設TCP協議的21埠,TFTP服務預設UDP協議的69埠(如上例所示)。在使用客戶端程式時,必須指定伺服器的主機名或IP地址,如果不明確指定埠號則採用預設埠,請讀者查閱ftp、tftp等程式的man page瞭解如何指定埠號。/etc/services中列出了所有well-known的服務埠和對應的傳輸層協議,這是由 IANA(Internet Assigned Numbers Authority)規定的,其中有些服務既可以用TCP也可以用UDP,為了清晰,IANA規定這樣的服務採用相同的TCP或UDP預設埠號,而另外一些TCP和UDP的相同埠號卻對應不同的服務。
很多服務有well-known的埠號,然而客戶端程式的埠號卻不必是well-known的,往往是每次執行客戶端程式時由系統自動分配一個空閒的埠號,用完就釋放掉,稱為ephemeral的埠號,想想這是為什麼。
前面提過,UDP協議不面向連線,也不保證傳輸的可靠性,例如:
傳送端的UDP協議層只管把應用層傳來的資料封裝成段交給IP協議層就算完成任務了,如果因為網路故障該段無法發到對方,UDP協議層也不會給應用層返回任何錯誤資訊。
接收端的UDP協議層只管把收到的資料根據埠號交給相應的應用程式就算完成任務了,如果傳送端發來多個數據包並且在網路上經過不同的路由,到達接收端時順序已經錯亂了,UDP協議層也不保證按傳送時的順序交給應用層。
通常接收端的UDP協議層將收到的資料放在一個固定大小的緩衝區中等待應用程式來提取和處理,如果應用程式提取和處理的速度很慢,而傳送端傳送的速度很快,就會丟失資料包,UDP協議層並不報告這種錯誤。
因此,使用UDP協議的應用程式必須考慮到這些可能的問題並實現適當的解決方案,例如等待應答、超時重發、為資料包編號、流量控制等。一般使用 UDP協議的應用程式實現都比較簡單,只是傳送一些對可靠性要求不高的訊息,而不傳送大量的資料。例如,基於UDP的TFTP協議一般只用於傳送小檔案(所以才叫trivial的ftp),而基於TCP的FTP協議適用於各種檔案的傳輸。下面看TCP協議如何用面向連線的服務來代替應用程式解決傳輸的可靠性問題。
7. TCP協議
7.1. 段格式
TCP的段格式如下圖所示
圖 36.12. TCP段格式
和UDP協議一樣也有源埠號和目的埠號,通訊的雙方由IP地址和埠號標識。32位序號、32位確認序號、視窗大小稍後詳細解釋。4位首部長度和IP協議頭類似,表示TCP協議頭的長度,以4位元組為單位,因此TCP協議頭最長可以是4x15=60位元組,如果沒有選項欄位,TCP協議頭最短20位元組。URG、ACK、PSH、RST、SYN、FIN是六個控制位,本節稍後將解釋SYN、ACK、FIN、RST四個位,其它位的解釋從略。16位檢驗和將TCP協議頭和資料都計算在內。緊急指標和各種選項的解釋從略。
7.2. 通訊時序
下圖是一次TCP通訊的時序圖。
圖 36.13. TCP連線建立斷開
在這個例子中,首先客戶端主動發起連線、傳送請求,然後伺服器端響應請求,然後客戶端主動關閉連線。兩條豎線表示通訊的兩端,從上到下表示時間的先後順序,注意,資料從一端傳到網路的另一端也需要時間,所以圖中的箭頭都是斜的。雙方傳送的段按時間順序編號為1-10,各段中的主要資訊在箭頭上標出,例如段2的箭頭上標著SYN, 8000(0), ACK 1001, ,表示該段中的SYN位置1,32位序號是8000,該段不攜帶有效載荷(資料位元組數為0),ACK位置1,32位確認序號是1001,帶有一個mss選項值為1024。
建立連線的過程:
客戶端發出段1,SYN位表示連線請求。序號是1000,這個序號在網路通訊中用作臨時的地址,每發一個數據位元組,這個序號要加1,這樣在接收端可以根據序號排出資料包的正確順序,也可以發現丟包的情況,另外,規定SYN位和FIN位也要佔一個序號,這次雖然沒發資料,但是由於發了SYN位,因此下次再發送應該用序號1001。mss表示最大段尺寸,如果一個段太大,封裝成幀後超過了鏈路層的最大幀長度,就必須在IP層分片,為了避免這種情況,客戶端宣告自己的最大段尺寸,建議伺服器端發來的段不要超過這個長度。
伺服器發出段2,也帶有SYN位,同時置ACK位表示確認,確認序號是1001,表示“我接收到序號1000及其以前所有的段,請你下次傳送序號為1001的段”,也就是應答了客戶端的連線請求,同時也給客戶端發出一個連線請求,同時宣告最大尺寸為1024。
客戶端發出段3,對伺服器的連線請求進行應答,確認序號是8001。
在這個過程中,客戶端和伺服器分別給對方發了連線請求,也應答了對方的連線請求,其中伺服器的請求和應答在一個段中發出,因此一共有三個段用於建立連線,稱為'''三方握手(three-way-handshake)'''。在建立連線的同時,雙方協商了一些資訊,例如雙方傳送序號的初始值、最大段尺寸等。
在TCP通訊中,如果一方收到另一方發來的段,讀出其中的目的埠號,發現本機並沒有任何程序使用這個埠,就會應答一個包含RST位的段給另一方。例如,伺服器並沒有任何程序使用8080埠,我們卻用telnet客戶端去連線它,伺服器收到客戶端發來的SYN段就會應答一個RST段,客戶端的 telnet程式收到RST段後報告錯誤Connection refused:
$ telnet 192.168.0.200 8080
Trying 192.168.0.200...
相關推薦
TCP/IP協議棧與資料包封裝
TCP/IP網路協議棧分為應用層(Application)、傳輸層(Transport)、網路層(Network)和鏈路層(Link)四層。如下圖所示 圖 36.1. TCP/IP協議棧 兩臺計算機通過TCP/IP協議通訊的過程如下所示 圖 36.
Linux 從網卡到TCP IP協議棧數據流跟蹤與審計
軟中斷 sys load 一個 註冊 linux rst 是否 ring 前沿 在學代碼審計,然後最近做Linux協議棧的審計,發現Linux不愧是一個久經考驗的系統,本來以為可以找到個DoS的,結果發現其在TCP/IP協議棧的鏈路層實現,利用了各種技術,用來提高性能與安全
OSI 7層模型與TCP/IP協議棧4層模型
OSI 7層模型是指開放系統互連參考模型(Open System InterConnect),是為了實現開放系統互連所建立的通訊功能模型。 OSI 7層模型 第7層:應用層(Application Layer)---提供為應用程式而設的介面,來與另一個應用程式之間進行通訊。
TCP/IP協議棧在wireshark的抓包
OSI模型對應的TCP/IP協議棧 注:osi模型是個理論框架,而TCP/IP協議棧是一個事實標準,所以我主要學的是TCP/IP協議棧 1)應用層: 作用:為使用者體統軟體介面 軟體: 即時通訊軟體 =》 微信、QQ 購物軟體 = 》 天貓、京東 音影類:pp
使用java自造TCP/IP協議棧:使用JPCAP實現資料發包
從本節開始,我們打算使用java把tcp/ip網路協議棧重新實現一遍。這是一個不小的野心,自然也是一個不小的工程,好在前面順利完成了作業系統,編譯器兩門課程的實現,這給了我極大的信心。整個網際網路系統分為三大支柱,分別是作業系統,編譯器,和網路協議,我們完成了前面三者,還剩第三者一直孤懸
TCP/IP協議棧初始化(十一)完結篇-完成IP層與網絡卡的連線
上回ICMP的插曲說完了,把一個ICMP socket的建立流程說完了。對於資料結構關係圖沒有加入什麼新元素。執行的流程是從inet_family_ops到inet_create,raw_prot,這樣的執行順序。此時完成的只是ICMP協議的處理socket。繼
TCP/IP協議棧部分系列4: IP層IP封包中TTL值何時修改
題記:本系列文章的目的是拋開書本從原始碼和使用的角度分析Linux核心和相關原始碼,byhankswang和你一起玩轉linux開發 輕鬆搞定TCP/IP協議棧,原創文章歡迎交流, [email protected] 歡迎加入到CHLK - Linux開
OSI七層參考模型 與 TCP/IP協議棧
一、OSI參考模型——開放式通訊系統互聯參考模型第七層——應用層: 是使用者與計算機交流的場所,功能是通過人機互動介面提供各種各樣的服務。主要是一些終端的應用(例如QQ、瀏覽器等一些在系統桌面上可以看到的東西)。第六層——表示層: 主要功能是對接收到的資料進行編碼、解碼、
TCP/IP協議棧模型
路由 會話管理 add 網絡設備 源地址 解密 發的 傳輸協議 認證 OSI七層模型介紹: 下面4層(物理層、數據鏈路層、網絡層和傳輸層)主要提供數據傳輸和交換功能,即以節點到節點之間的通信為主;第4層作為上下兩部分的橋梁,是整個網絡體系結構中最關鍵的部分;而上3層(會話
TCP/IP協議棧
ip tcp TCP/IP協議棧全稱是傳輸控制協議/因特網互聯協議,其實是OSI模型的進化版,所以就先解釋一下什麽是OSI模型,OSI的全稱是開放系統互連參考模型,就是為了實現開放系統互連所建立的通信功能分層模型,其目的就是為異種計算機互連提供一個共同的基礎和標準框架,並為保持相關標準的一致性和兼
做運維需要了解的網絡知識,TCP/IP協議棧
tcp/ip協議棧的基本介紹TCP/IP協議棧:TCP/IP的分層:圖中看的很清楚,在TCP/IP協議棧中,最重要的協議就是傳輸層的TCP協議與UDP協議,而網絡層最重要的是IP協議,下面就做一下簡單的介紹。TCP協議:TCP協議是一種工作在傳輸層,全雙工(雙向傳輸),半關閉,擁有錯誤檢查,確認機制,和數據恢
002::每天五分鐘入門TCP/IP協議棧::IP協議之IP首部長度問題
IP 首部 首部長度 事出反常必有妖,邪乎到家必有鬼。 整個TCP/IP協議中,IP協議是最核心的協議。 IP協議是不可靠的、無連接的服務。 何為不可靠?不能保證IP數據報能夠成功到達目的地,傳輸的可靠×××給傳輸層或應用層去實現。 何為無連接?IP並不維護任何關於後續數據報的狀態信息。 進入正題
003::每天五分鐘入門TCP/IP協議棧::IP協議之TOS字段說明
IP首部 ToS服務類型 從IP首部看ToS的位置:ToS即為服務類型,只有當網絡設備能夠支持(能夠識別IP首部中的ToS字段)識別ToS字段時,這給字段設置才有意義。否則都是空談。 先說具體字段的意義:Tos字段長度為8bit前3bit字段:為優選權子字段,現在已經廢棄,這個字段默認值是000,從w
TCP/IP協議棧基礎知識
協議 fin 存儲 無數據 可靠 技術分享 事物 ip協議 同步 設計思想 把一個復雜的事物進行分層劃分,使得每個部分變得相對簡單 分層模型 OSI分為7層模型 tcp/ip分為四層模型 應用層(Application) 傳輸層(T
004::每天五分鐘入門TCP/IP協議棧::IP協議之16位總長度字段引出的MTU值問題
IP首部 MTU 數據封裝 要理解MTU以及實際生產環境中的MTU問題,就得搞清楚三個問題:IP數據報包含什麽內容;數據進入協議棧的封裝過程;MTU具體代表含義; 首先要理解一個過程:數據進入協議棧的封裝過程!數據從發送主機發送出去之前,在主機的協議棧中會經歷上述圖中的幾個封裝過程。本次以TCP
TCP/IP協議原理與介紹
因此 關註 數據量 fin end F5 編號 它的 巨人 一、什麽是TCP/IP? 顧名思義 TCP/IP(Transmission Control Protocol/Internet Protocol),傳輸控制協議/網際協議,TCP/IP是現代Internet的核心技
-1-7 java 網絡編程基本知識點 計算機網絡 TCP/IP協議棧 通信必備 tcp udp
kit 外部 block 識別 ESS net 常見 主機 通訊 計算機網絡 是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接起來, 在網絡操作系統,網絡管理軟件及網絡通信協議的管理和協調下,實現資源共享和信息傳遞的計算機系統。 網絡編程
網絡基礎之OSI模型及TCP/IP協議棧
ack 二進制 能夠 系統 http 數據表 滑動 鏈路 ext OSI參考模型 開放系統互連參考模型為實現開放系統互連所建立的通信功能分層模型。其目的是為異種計算機互連提供一個共同的基礎和標準框架,並為保持相關標準的一致性和兼容性提供共同的參考。這裏所說的開放系統
TCP/IP協議各層資料格式及首部含義
TCP/IP四層模型 原帖:http://www.cnblogs.com/BlueTzar/articles/811160.html TCP/IP參考模型 ISO制定的OSI參考模型的過於龐大、複雜招致了許多批評。與此對照,由技術人員自己開發的TCP/IP協議棧獲得了更為廣泛的應用
5.CCNA第五天-TCP/IP協議棧的網際網路層
TCP/IP協議棧的網際網路層 IP internet prootocol 網際網路協議 工作在網路層 為網路層提供邏輯地址服務 MAC地址,僅僅能夠在同一廣播域內,為主機提供資料轉發服務 IP地址: 實現跨越廣播域的資料轉發