【計算機網路】讀書筆記之《TCP/IP詳解卷1》《圖解TCP/IP》《計算機網路》三合一
最近把之前看過的三本關於網路的書一起做了一下總結。
第一本是謝希仁的《計算機網路》,這本算是為數不多的國內的好教材,裡面雖然有些內容過時,稍顯臃腫,但是有些章節講的非常不錯。
第二本是《圖解TCP/IP》,日本人寫的書,非常認真細緻,文字結合大量圖片通俗易懂,入門不錯,但是還是不夠深入。
第三本是《TCP/IP詳解卷1》,美國人寫的書學術性質較強,比較難懂,但是很深入。結合tcpdump輸出結果能讓人更好的理解。
在看這本卷1之前,特地去先學習了一下《wireshark資料報分析實戰》,跟著提供的例子學習了一下。這本書非常好的一個地方就是讓抽象的東西具體化,比如三次握手SYN,ACK包,四次揮手FIN,ACK的傳送接收情況可以一目瞭然。
同時,我也自己嘗試抓了一下學校無線網的登陸過程,在HTTP包裡面發現無線網登入驗證居然是明文的,也就是說可以弄個抓取無線訊號的裝置包括手機訊號都可以抓到,然後對有興趣的內容進行分析。總的來說,看完這本資料包分析,加上前面2本書,看卷一感覺不會吃力。
下面先放上自己用XMind畫的思維導圖,主要還是卷1的內容,有部分內容結合了前面兩本書。
下面再附上整本書的筆記,都是一些重點章節的的重點內容。
ch1 概述
1.TCP/IP分層:物理層,資料鏈路層(ARP),網路層(IP,ICMP,IGMP),傳輸層(TCP,UDP),應用層。
ABCDE類地址。A類網路號8位(第一位0),24位主機號。
B類網路號16位(前二位10),16位主機號。
C同理,D類前面4位1110+28位多播組號。
2.封裝和分用,分用時每層都檢測報文表示的協議首部得到上層協議。ICMP與IGMP都被封裝在IP資料包裡,相當於IP的上層,但實際他們是同一層協議。
3.一共有16位65535個埠號,其中保留埠號:1~1023。
ch2 鏈路層
1. 802標準定義封裝
2. 乙太網首部封裝至少64位元組:目的地址+源地址(48 bit)+型別(2byte)+資料(至少46位元組不足填充pad)+CRC(4byte)
3. SLIP(序列線路IP):IP資料包以END(0xc0)作為開頭和結尾;IP報文中某個字元的END用0xdb和0xdc代替;0xdb被稱為SLIP的ESC字元,若IP報文段出現此字元,用0xdb和0xdd取代。(與乙太網封裝比無型別和首部)
4. PPP(點對點協議):由LCP鏈路控制協議和NCP網路控制協議組成。PPP支援多種協議,而SLIP只支援IP,PPP有CRC檢驗。PPP不涉及ARP。
5. 環回介面:localhost127.0.0.1
傳給環回地址的資料均作為IP輸入,應用程式有可能省略了傳輸層和網路層的操作,也可能實現了。
6.最大傳輸單元MTU:乙太網為1500 MSS:最大報文段長度=MTU-首部長(IP首部與上層協議首部和)
ch3 IP(網際協議)
1. IP協議提供不可靠,無連線,盡最大努力交付的服務。採用大端位元組序傳輸。
2.首部格式:
首部長度佔4位,單位為4位元組;總長度16位,單位為1位元組。
服務型別:第4~7位的TOS:最小時延,最大吞吐量,最高可靠性,最小費用
注意IP中的選項與TCP的選項欄位區別,一般IP的選項欄位較少使用。
2. IP路由:
a) 搜尋路由表,尋找能與目的IP完全匹配的條目。
b) 搜尋路由表,尋找能與目的網路號相匹配的條目。
c) 搜尋路由表,尋找標為預設的條目,如果沒找到,向傳送的主機返回一個主機不可達或網路不可達。
注意:1)所有主機和路由器都使用了預設路由
2)源目的IP始終不變化
3)每個鏈路層有不同的資料幀首部,而且鏈路層的目的MAC地址指的是下一站的鏈路層地址,源MAC地址就是傳送者,通過ARP請求得到。
3. 子網定址:主機號再分解成一個子網號和主機號並由系統管理員進行分配。
4. 子網掩碼:確定子網號和主機號的分界線,確定IP屬於本子網主機或本網路其他子網主機或其他網路主機。
CIDR:無型別域間選路,192.168.1.1/20表前20位網路號,後面是主機號,遵守最長匹配原則。
5. ifconfig -a報告所有介面資訊
netstat-in打印出所有介面資訊和IP地址而不是名字
ch4 ARP地址解析協議
1. 如果目的主機與傳送主機位於同一個區域網,則裝置驅動程式從不檢查IP資料包中目的IP地址,而是根據乙太網MAC地址確定目的介面。
2. ARP分組格式,乙太網幀型別包括IP資料包,ARP/RARP請求和應答。協議型別表示要對映的協議地址的型別。op是指四種操作型別,ARP請求值為1,ARP應答2…...
3. ARP請求包目的地址為ff:ff:ff:ff為廣播地址,收到應答方迴應後,不僅傳送方要把應答方mac地址寫入快取記憶體,應答方也把傳送方的mac地址寫入自己的快取記憶體,快取記憶體的生存時間一般為20分鐘。
4. 以下是使用ARP的四種典型情況:
網1(H1,H2)------路由器R1-------網2(H3)--------路由器R2---------網3(H4)
a) 傳送方是主機H1,要把IP資料包傳送到同個網路3的另一臺主機H2,只用在網1傳送一個arp廣播,找到目的主機H2的mac地址
b) 傳送方是主機H1,要把IP資料包傳送給另外一個網路3的一臺主機H4,同樣在網1廣播arp包,找到路由器R1的mac地址,剩下工作R1完成
c) 傳送方是路由器,傳送方是路由器R1,目的是同個網路2中的H3,直接在網2廣播,找到主機H3的mac地址
d) 傳送方是路由器R1,接收方是另個網路3的主機H3,R1在網2廣播,找到連線在網2的路由器R2的mac地址,剩下的工作由R2完成
此過程中,IP資料包源目的IP始終不變,而資料包的源目mac地址始終在不斷改變。這些中間經過的路由器也稱為委託ARP或ARP代理。
5.免費ARP:主機發送ARP查詢自己的IP地址
a)如果另外的主機設定了相同的IP地址,會產生一個錯誤資訊
b)使用ARP請求中的傳送端硬體地址更新快取記憶體
6.arp -a顯示ARP快取記憶體的所有內容
-d刪除某一個內容 -s增加快取記憶體的內容
ch6 ICMP網際控制報文協議
1. 首部由8位型別,8位程式碼,16檢驗和,內容組成。報文種類分為ICMP差錯報告報文,ICMP詢問報文。
a) 差錯報告報文型別:
i. 目的不可達(埠號不正確)
ii. 源點抑制(主機由於擁塞而丟棄資料報)
iii. 超時(TTL為0)
iv. 引數問題(首部欄位值不正確)
v. 改變路由(重定向)
不應該傳送ICMP差錯報文的幾種情況:
1) ICMP差錯報文
2) 目的地址為廣播或多播地址,包括鏈路層的廣播資料報(防止廣播風暴)
3) 除了IP分片的第一片
4) 源地址不是單個主機的資料報
b) 詢問報文
i. 回顯請求和回答(測時目的站是否可達及狀態資訊)
ii. 時間戳請求和回答(請某個主機或者路由器回答當前日期時間)
2. ICMP埠不可達差錯
假設使用UDP檢視該報文,每個“UDN埠不可達”返回的ICMP報文共70位元組:
乙太網首部 |
IP首部 |
ICMP首部 |
產生差錯的資料報IP首部 |
UDP首部 |
14位元組 20位元組 8位元組 20位元組 8位元組
ß---------------------------IP資料報------------------------------------à
ß---------------ICMP報文---------------------------------à
ß----------------------ICMP資料部分------à
傳送前一個IP首部的目的使ICMP知道如何解釋後面8位元組的協議部分。
0 7 8 15 16 32
型別3 |
程式碼0-15 |
檢驗和 |
未用 |
||
IP首部+原始IP資料報中前8個位元組(得到源埠號和目的埠號) |
ICMP不可達報文
在ICMP報文中,當代碼為4時,在路徑MTU發現機制允許路由器把外出介面的MTU填在第二個32bit的低16位中。
ch7 ping程式
1. 如果不能ping到某臺主機,也可能是由於路由器防火牆過濾。
ICMP回顯請求和回顯應答報文格式
識別符號通常為程序ID,序號從0開始,每傳送一次回顯請求就加1,有可能丟失、失序、重複。執行ping返回seq和time。
2. ping -R提供了路由記錄的功能,由於IP首部欄位長度為4bit,15位元組*4位元組單位=60位元組最大,60-20首部固定長度-3RR選項(code,len,ptr)=37位元組,最多隻能存9個地址。code為IP選項的型別這裡為7,len為RR選項總長度,ptr指向存放下個IP的位置。
3. IP時間戳選項,與記錄路由選項類似,此處code為0x44,還多了OF溢位和FL標誌欄位共1位元組。
ch8 traceroute程式
1. 由於IP首部留給選項空間十分有限,並不是每個路由器都支援這個選項。
2. traceroute程式通過區分接受到的ICMP報文是超時(經過路由)還是埠不可達(到達目的主機)以確定結束時間,顯示的結果就是中間經過的路由器以及所花費的時間,*表示未探查到應答訊號。
3. ICMP超時報文結構與ICMP不可達類似,不同的是其型別為11,程式碼為0或1。
4. IP源站選路選項:
a) 寬鬆的源站選路,指定經過的IP清單,但其中可通過其他路由器。
b) 嚴格的源路由選擇,採用確切路由。
ch9 IP選路
1.路由表經常被訪問,但被路由守護程式大約30秒更新一次,收到ICMP重定向報文也會更新路由表。IP提供選路機制,路由守護程式提供選路策略。
2.搜尋路由表的幾個步驟:
a) 搜尋匹配的主機地址
b) 搜尋匹配的網路地址
c) 搜尋預設表項
4. netstat -rn
a) 其中Flags的U表示可用,G表示該路由為閘道器(路由器),H表目的為主機(沒設定就是網路地址),D表該路由由重定向建立,M表該路由已被重定向修改。
b) G標誌區分了直接路由和間接路由。
i. 間接路由時,閘道器地址是路由器。
ii. 直接路由,目的mac地址為點對點鏈路的另一端,閘道器地址為外出介面的本地IP地址。
c) Refcnt表示正在使用路由的活動程序個數
d) use表示通過該路由傳送的分組個數
5. 每個主機都必須支援多個預設路由,常見的實現方式是按輪轉使用它們。
6. 可以從沒有H的那行得出目的地址的子網掩碼,因為那行所代表的目的地址為網路地址。
7. IP選路的方式就按照上面3個所列,目的IP始終不變,目的mac地址為路由器或者目的端地址。
8. 初始化路由表可以手動設定(較少),執行路由守護程式,使用較新的路由器發現協議。對主機來說為靜態選路,適合於網路較小且與網路只有單個連線點。
9. 對於沒有到達目的地的路由,如果該IP報由主機產生,就給傳送該資料包的應用程式返回一個差錯;如果是被轉發的資料報,就給原始傳送端傳送ICMP主機不可達差錯報文。
10. ICMP重定向一般讓具有很少選路資訊的主機逐漸建立更完善的路由表,重定向報文是為主機服務,而不是路由器;路由表還可以由路由器發現報文改變。但是不能同時被這2種方式修改。
11. 主機做路由器時要滿足:
d) 出介面必須等於入介面
e) 用於向外傳送資料報的路由不能被ICMP重定向報文建立或修改,不能為預設路由
f) 資料報不能用源站選路轉發
g) 核心必須配置成可以傳送重定向報文
12. 收到ICMP重定向修改路由表之前要做的檢查:
h) 新的路由器必須直接與網路相連
i) 重定向報文必須來自當前到目的地所選擇的路由器
j) 重定向報文不能讓主機本身做路由器
k) 被修改的路由必須為間接路由
路由器應該傳送的是對主機的重定向,而不是對網路的重定向。
13. 初始化路由表的另外一種方法是廣播或者多播傳送一份路由器請求報文(由使用者程序產生)。ICMP路由器通告報文使得路由器在一份報文中可以通告多份報文,路由器地址和優先順序組成一項,值越大說明作為預設路由器的優先順序越高,預設一般為0,0x80000000表不可做預設路由器使用。
14. 路由器會定期隨機傳送通告報文,並且監聽來自主機的請求報文。主機引導期間一般傳送3份路由器請求報文,同時也會監聽來自相鄰路由器的通告報文。
ch10 動態選路協議
1. 通過路由器上的路由守護程序,如routed,gated
2. 內部閘道器協議:選路資訊協議RIP、最短路徑優先OSPF
外部閘道器協議BGP
3. RIP報文包含在UDP資料包中,4位元組固定首部。常用的UDP埠號是520。命令欄位1表請求,2表應答。一個報文最多可有25個路由,每個路由佔20位元組格式。
啟動的過程如下:
a) 初始化,在每個開啟的介面傳送請求報文(一般是廣播路由控制資訊)。
b) 接收到請求,如果是特殊請求就傳送完整路由表。否則就根據距離向量依次處理每一個,如果是連線到指明地址的路由設定成我們的值,否則就設定為16表無窮大。
c) 接受到響應,可能會更新路由表,增加、修改、刪除。
d) 定期選路更新,每過30秒,素有或部分路由器將完整路由表傳送給相鄰路由器。
e) 觸發更新,不需要傳送完整路由表只需要傳送那些發生變化的表項。
4. 可能產生的問題:
無限計數 ,解決辦法:
a) 最長距離不大於16
b) 路由器不再把所受到的路由訊息原路返回給傳送端
路由環路:
c) 毒性逆轉:網路中發生鏈路中斷,不是不傳送這個訊息而是把這個無法通訊的訊息傳播出去,即傳送距離為16的資訊。
d) 觸發更新:指路由資訊變化時,不等待30秒而是立刻傳送出去。
這兩種方法可以使路由資訊儘快收斂。
5. 由於RIPv1 會自動彙總有類網路間各子網的路由,所以RIPv1不支援不連續子網。不連續子網指在一個網路中,某幾個連續由同一主網劃分的子網在中間被多個其它網段的子網或網路隔開了。RIPv2支援不連續子網。
6. 假設R4->R6發來路由表,要更新R6的路由表,步驟如下:
a) R4表所有距離加1,下一跳改為R4
b) 若R4中有與R6不同的專案,加入R6的路由表
c) 若R4,R6中目的網路,下一跳路由器一致,就更新R6的距離為R4提供的距離
d) 若R4,R6目的網路名一樣,下一跳不同,則在R6表更新較短的距離
7. RIP2中選路域為選路守護程式的識別符號,可以使程序號。選路標記為支援外部閘道器協議存在,攜帶一個EGP和BGP的自制系統號。每一個路由表象增加了一個32位子網掩碼和32位下一站IP(0表示發往目的地址的報文應該傳送給傳送RIP報文的系統)。
8. OSPF最短路徑優先有5種類型的包:
a) 問候 b)資料庫描述 c)鏈路狀態請求 d)鏈路狀態更新
i. 通過傳送問候包確認是否連線。
ii. 利用資料庫描述包相互發送路由摘要資訊和版本資訊,若版本較老,首先發送一個鏈路狀態更新請求路由控制資訊。
iii. 然後由狀態更新包接受路由狀態資訊,最後再通過鏈路狀態確認包通知大家本地已經接受到路由控制資訊。
鏈路狀態更新包有2類資訊,一是網路LSA(鏈路狀態通告),二是路由器LSA,每個路由器生成一個表示網路結構的鏈路狀態資料庫,根據這個資料庫採取dijkstra演算法生成相應的路由控制表。
9. BGP邊界閘道器協議中資料包送達目的網路時,會生成一箇中途經過所有AS(自治系統)的編號列表,在AS路徑資訊訪問列表中不僅包含轉發方向和距離,還包括途徑所有AS的編號。BGP屬於路徑向量協議。
ch11 UDP使用者資料報協議
1.
a) 偽首部是不存在的,只有在計算檢驗和時有用,檢驗和是簡單的16bit和,它檢測不出交換兩個16bit的差錯,如果資料報是奇數長度,要用填充欄位填充。
b) UDP檢驗和可選(檢驗和欄位為全0未開啟),而TCP的檢驗和是必須的。
c) 如果傳送端沒有計算檢驗和而檢測段檢測到檢驗和有差錯,該UDP資料報就被丟棄,不產生任何差錯報文。
d) 接收端收到傳送端報文後連同偽首部按二進位制反碼求和,無差錯應為全1,否則丟棄。
e) 每次執行程式時,UDP源埠號都發生變化。
2. 路徑MTU發現機制,每隔30s把DF設定為1,檢視路徑MTU是否增大了
a) UDP情況:
i. 傳送時IP首部設定不分片,路由器丟包
ii. 由ICMP通知下一次MTU大小,通過不可達報文
iii. UDP沒有重發處理,應用傳送下一個訊息時,UDP層傳過來的資料報在IP層被分片,且對IP並不區分UDP首部和資料。到達目的後在IP層重組上傳
b) TCP情況:
i. 傳送時IP首部設定不分片,路由器丟包
ii. 由ICMP不可達報文通知下一次MTU大小
iii. 根據TCP的重發處理,資料報被重傳。TCP負責將資料分成不會被IP層再分片的粒度後傳給IP層,IP層不做分片處理
iv. 不需要IP層重組,資料被原樣傳送給接收端主機的TCP層
3. 當一份IP資料報被分片後,只有到達目的地才進行重組,已經分片過的資料報有可能會再進行分片。IP首部序號,標誌欄位,片偏移欄位與分片有關。
4. IP分片傳輸過程,及時丟失一片資料也要重傳整個資料報。除最後一片,每一片的資料報長度必須是8的整數倍。
5. IP首部被複制到各個片中,但是埠號和UDP首部只能在第一片中被發現。IP資料報是IP層端到端的傳輸單元,分組是指IP和鏈路層之間傳送的資料單元。分組可以是完整的IP資料報也可以是一個分片。
6. UDP與ARP的互動:我們傳送一個會被IP層分成6片的UDP資料報,且執行程式前,ARP快取是空的。
a) 每個資料報片會引發一個ARP請求,在接受到第一個ARP應答時,只發送最後一個數據報片,前5個均被丟棄了。在大多數實現中,在等待一個ARP應答時,只將最後一個報文傳送給特定目的主機。
b) 在收到第一個資料報片,IP層啟動一個定時器,定時器超時而所有資料報片未能全部到達,這些資料報將被丟棄。但是除非接收到第一個資料報片,否則不會產生ICMP組裝超時差錯,因為只有第一個資料報片包含了運輸層首部(為了區分是哪個程序所傳送的資料報)。
7. UDP首部最大65535位元組,資料部分65507位元組,TCP/IP核心也會限制。一般應用都限制應用程式資料為512位元組或更小。
8. 設計UDP伺服器時可以限制本地IP地址,遠端IP地址;採用多播可以使每個埠有多個接收者:即多個端點可使用同個IP地址和UDP埠號。
ch12 廣播和多播
1. 只用於UDP。廣播是一個主機要向網上所有其他主機發送幀。多播是幀僅傳送給屬於多播組的多個主機。多播適用於一個區域網或者跨越臨近區域網的多播。
2. 協議棧各層對收到幀的過濾過程:介面卡->裝置驅動程式->IP->UDP->程序
3. D類IP地址格式:4位1110+28位多播組ID
a) 能夠接受發往一個特定多播組地址資料的主機集合稱主機組。主機組可跨網路,主機組多主機數量無限制,不屬於某主機組主機可向該組傳送資訊。
b) 224.0.0.1代表該子網內所有系統組,224.0.0.2代表該子網內所有路由器組,224.0.0.1用作網路時間協議NTP,224.0.0.9用作RIP2
4. a) IP多播地址對應的乙太網範圍01:00:5e:00:00:00~01:00:5e:ff:ff:ff其中01指明為乙太網多播地址,其中23bit用於與IP多播組號對應,通過將多播組號低位23bit對映到乙太網低位23bit實現。
b) 由於多播組號的最高5bit在對映過程被忽略,因此會有32個不同的多播組號被對映為一個乙太網地址,那麼裝置驅動程式或IP層就必須對資料報進行過濾。
5. 單個物理網路中:多播程序將目的IP地址指明為多播地址,裝置驅動程式將它轉換為相應的乙太網地址,然後傳送資料。接受程序要通知IP層他們想接受的發往給定多播地址的資料報,且裝置驅動程式要能接受這些多播幀。
6. 確認是否有接收端,通過IGMP:網際組管理協議實現。
ch17 TCP傳輸控制協議
1. TCP通過下列方式來提供可靠性:
a) 應用資料被分割成TCP認為最合適傳送端資料塊。
b) 自適應的超時以及重傳策略。
c) TCP收到資料的確認機制,包括延遲確認。
d) 檢驗和,若不對就丟棄等待發送端超時重傳。
e) TCP 包失序的資料排序後上交應用層。
f) 接收端丟棄重複的報文段。
g) 傳送端使用擁塞視窗,接收端使用通告視窗進行流量控制。
2. TCP首部:
URG=1告訴系統此報文段有緊急資料要優先傳送,緊急指標欄位有效指向緊急資料的末尾在報文段的位置。
ch18 TCP連線的建立與終止
1. 三次握手:
2. 四次揮手:
值得注意的是:
a) SYN和FIN佔用一個序號,而ACK不佔用序號。ACK報文段通常只有一個IP首部和TCP首部
b) ISN可看做是一個32bit的計數器,每4ms加1。
c) TIME-WAIT等待2MSL(2倍最長報文段壽命)的原因:
i. 為保證A傳送的最後一個ACK可以到達B。這個報文有可能丟失,如果B在LAST-ACK時間未收到確認,就會重傳這個FIN+ACK,接著A重傳確認,重啟2MSL定時器。
ii. 保證下一個新的連線中不會出現這種舊的連線請求報文段。防止來自該連線的上一個連線的遲到報文段作為新連線的一部分。一個插口對(源目的IP,源目的埠)唯一確定一組連線。
3. 最大報文段長度MSS:
a) 當連線建立時,雙方都要通告各自的MSS,如果一方不接受另一方的MSS,則MSS就設定為預設值536位元組。通常一方的MSS=外出介面MTU-IP首部-TCP首部。
b) 如果目的IP與源IP不屬於同個網路,MSS預設值通常為536位元組。大多數TCP實現都提供一個選項設定MSS儘可能的大。MSS恰當的值是恰好不會被IP分片。
4. 通常應用程式呼叫shutdown半關閉,close終止兩個方向的連線。半關閉表示客戶端已經完成了它的資料傳送,但仍要接受伺服器的資料。傳送FIN實際傳送了一個檔案結束符。
5.
實線箭頭:說明客戶的正常狀態變遷。 虛線:為伺服器的正常狀態變遷。
應用:應用執行某種操作時發生的狀態變遷。 接收:表示收到TCP報文段狀態的遷移。
傳送:表示為進行某個狀態變遷要傳送的TCP報文段。
a) 兩個導致進入ESTABLISHED狀態的變遷對應開啟一個連線,而導致離開ESTABLISHED狀態的變遷對應關閉一個連線。ESTABLISHED表雙方已經能夠雙向傳遞資料。
b) 只有當SYN_RCVD狀態是由LISTEN狀態進入,而不是SYN_SENT進入時,從SYN_RCVD回到LISTEN的狀態變遷才是有效的。
6. TCP重啟後的MSL秒內不能建立任何連線,我們稱之為平靜時間。
7. 傳送復位RST的情況:
a) 到不存在埠的連線。
b) 異常終止一個連線。
c) 檢測半開啟連線。比如當客戶端與主機突然斷開,並重啟伺服器,客戶端繼續傳送資料,伺服器將回應RST。
8. 對同時開啟的處理是僅建立一條連線而不是兩條。
9. 同時關閉:應用層發出關閉命令,兩端均從ESTABLISHED變為FIN_WAIT_1,當收到另一端發來的第一個FIN就進入CLOSING,同時發出最後一個ACK後就進入TIME_WAIT。
10. TCP選項:
TCP首部中視窗擴大選項長度為16位,因此最大的視窗大小為64k,視窗擴大選項佔3位,最大值14,相當於視窗最大值增大到2^(16+14)-1
時間戳選項:a)計算往返RTT b)用來處理TCP序號超過2^32的情況,即防止序號繞回PAWS。
11. TCP伺服器的設計:
a) TCP通過四元組唯一確定一組連線。也可以限定本地、遠端IP地址。
b) 積壓值說明TCP監聽的端點已被接受(三次握手完成)而等待應用層接受的最大連線數。積壓值並不影響系統所允許的最大連線數,或併發伺服器所能處理的客戶。
c) 應用層只有在三次握手中第三個報文段收到後才知道這個新連線,當客戶程序連線開啟但伺服器應用層還不知道這個新連線時,伺服器的TCP僅將接受的資料放入緩衝佇列。
d) 如果對於新的連線請求,連線佇列沒有空間,TCP不會理會收到的SYN(也不發回RST)。
e) TCP無法使客戶程序的主動開啟失效。當心客戶連線傳遞給應用程式時,TCP的三次握手已經結束,客戶的主動開啟已經成功。伺服器不打算為客戶進行服務所能做也就是關閉這個連線。
ch19 TCP的互動資料流
1. 按照分組數量計算,約有一半的資料包含成塊資料,另一半則包含互動資料。按照位元組計算二者比例大約9比1。
2. 延遲確認(捎帶確認):通常TCP在接收到資料時並不立刻傳送ACK,推遲傳送,以便將ACK與需要沿該方向傳送的資料一起傳送。
3. Nagle演算法:TCP收集少量的分組,並在確認到來時以一個分組的方式發出去。確認到達的越快,資料也就傳送的越快。
ch20 TCP的成塊資料流
1. 線路上分組順序依賴於許多無法控制的因素:
a) 傳送方與接收方TCP的實現。
b) 接受程序讀取資料。
c) 網路的動態性。
2. 滑動視窗表明可以立刻傳送多少資料。當收到一個有效的ACK時,視窗左側會向右合攏,視窗右邊右移(視窗張開)將允許傳送更多的資料。如果收到一個指示視窗向左移動的ACK,被認為是一個重複的ACK會被丟棄。
a) 傳送發不必傳送全視窗大小
b) 來自接收方的確認資料把視窗右移
c) 視窗大小可以減小,但是視窗右沿無法向左移動
d) 接收方傳送一個ACK前也不必等待視窗填滿
3. 傳送方使用PSH標誌通知接受方將受到的資料全部提交給應用程式,同時清空快取。
4. 如果傳送方一開始變向網路傳送多個報文段,直到達到接收方通知的視窗大小,當二者處於同個區域網這個方式是可行的。但是如果二者之前存在多個路由器或速度較慢的鏈路,一些中間路由器必須快取分組,有可能耗盡儲存器的空間。因此必須採用慢啟動演算法:開始時把擁塞視窗cwnd=1,然後收到一個ACK擁塞視窗就增加一個報文段,呈指數增長。
5. 擁塞視窗是傳送方使用的流量控制,通告視窗是接收方使用的流量控制。
6. 速率較慢的情況下發送時延(主機或路由器傳送資料幀所花時間)其主要作用。
速度較快的情況下傳播時延(電磁波在通道傳播一定距離花費的時間)其主要作用。
對於高速鏈路,我們提高的僅僅是資料的傳送資料,而不是傳播速度。
7. 傳送快取存放:
a) 應用程式傳送給傳送方準備傳送的資料
b) 已經發送未被確認的資料
接受快取:
a) 按序號到達,但未被應用程式接受的資料
b) 未按序號到達的資料
8. 通道容量即頻寬時延積 bit=頻寬b/s * RTT
9. 一旦引起擁塞就會導致路由器丟棄分組
ch21 TCP的超時與重傳
1. 重傳定時器,堅持定時器(視窗大小探測),保活定時器,2MLS定時器。
2. 最簡單的策略每次重傳時間增加一倍,也就是指數退避。首次傳輸時間與復位訊號時間相差9分鐘,不可變。
3. RTT估計器的計算
karn 演算法:當一個超時和重傳發生時,在重傳資料的確認最後到達時,不能更新RTT估計器。
a) 初始SYN:RTO=A+2D=0+2*3=6s
A是被平滑的RTT(均值的估計器,這裡初始化為1)
D是被平滑的均值偏差,初始化為3
b) 當超時在5.8s(接近6s是因為使用了一個500ms的定時器)發生時,計算當前RTO=A+4D=12s,先使用倍數2,因此下一個超時時間取值為24s,再下一個取48s……假設重傳到達了,此時因為karn演算法,A,D值並未被更新。即使傳送第一個資料報文段,此時的RTO還是24s。
c ) 當第一個資料報文段的ACK到達時,假設經歷了3個時鐘週期,估計器被初始化為: A=M+0.5=1.5+0.5=2 D=A/2=1 M表示所測量的RTT,
因此: RTO=A+4D=6s
d) 當第二個資料報文段的ACK到達時,假設經歷了1個時鐘週期,估計器按照 下面更新: Err=M-A=0.5-2=-1.5 右側出現的A和D為上次的結果
A=A+gErr=2-0.125*1.5=1.8123 g=0.125
D=D+h(|Err | - D)=1+0.25*(1.5-1=1.125) h=0.25
RTO=A+4D=6.3124
4. 快速重傳演算法:傳送端收到三個連續的ACK確認號,就重傳ACK序號開頭的報文段。即ACK確認號就是接收方下一個期望收到的序號。
5.擁塞避免演算法:
a) 當擁塞發生時(超時或收到重複確認),慢啟動門限ssthresh被設定為視窗大小的一半(擁塞視窗和接收方通知視窗的最小值,至少2個報文段)。如果是超時引起的擁塞則cwnd為設定為1個報文段進行慢啟動。
b) 當cwnd<ssthresh,執行慢啟動
當cwnd>ssthresh,每收到一個確認,cwnd=cwnd+(segize*segsize)/cwnd,在一個RTT裡,cwnd最多增加1個報文段。
5. 快速重傳和快速恢復:
a) 當收到第三個重複的ACK時,將ssthresh設定為當前cwnd的一半。重傳丟失的報文段。設定cwnd為ssthresh+3segsize
b) 每次收到另一個重複的ACK,cwnd增加1個報文段大小併發送一個分組(如果新的cwnd允許)
c) 當下一個確認新資料的ACK到達時,設定cwnd為ssthresh,執行擁塞避免演算法。
6. 假設一次連線有16個視窗的資料,那麼A,D,ssthresh將被儲存在路由表中供下次使用。當建立一個新的連線時,如果該連線將要使用的路由表項已經有了這些度量的值,則用這些值來進行變數的初始化。
7. TCP對ICMP差錯的處理:
a) 源站抑制使擁塞視窗cwnd被設定為1個報文段並執行慢啟動,慢啟動門限不變。
b) 主機不可達或網路不可達將被忽略,TCP會執行指數退避方法進行重傳。重傳時間上限64。最後放棄顯示主機不可達,且傳送RST。
8. 當TCP超時並重傳時,它不一定要重傳同樣的報文段,相反,TCP允許重新分組傳送一個較大的報文段。
9. 當發生擁塞時,採用尾部丟棄原則,丟棄佇列擁塞以後到達的分組。假設當網路中有很多TCP連線時,會使許多TCP連線同一時間進入慢開始,我們稱之為全域性同步,全域性同步使得全網通訊量突然下降很多,網路正常後通訊量又突然增大很多。
a) 解決的辦法是採用隨機早起檢測RED
i. 若平均佇列長度小於最小門限,則把新到達分組加入佇列
ii. 若平均佇列長度大於最大門限,則丟棄新分組
iii. 在兩者之間就以某一個概率p丟棄分組
ch22 TCP的堅持定時器(零視窗探測)
1.為了防止視窗更新報文段的丟失:
只要TCP連線的一方收到對方零視窗通知,就啟動堅持定時器,若持續時間到,就傳送一個零視窗探測報文(1位元組),而對方就在確認這個報文段給出現在視窗值。如果視窗值仍然是0,收到報文段的一方就重新設定堅持定時器。
3. 糊塗視窗綜合徵:假設TCP快取已滿,互動式應用程式只從快取讀取1位元組,使快取僅空出1位元組,然後向傳送方傳送確認視窗設定為1位元組。就這樣來回,網路效率很低。
要解決這個問題,可以讓接收方等待一段時間,使得接受快取有足夠空間容納一個最長的報文段,或者等待接受快取已有一半空閒的空間。
ch23 TCP的保活定時器
1. 保活定時器的作用是在服務端檢測到這種半開放的連線:
a) 對端仍然正常執行:最後一次通訊的兩小時以後定時器復位。
b) 對端已經崩潰:傳送10個75s探查仍沒響應則認為對端已經關閉連線。
c) 對端已經奔潰並重啟:收到對保活探查的響應,這個響應是復位,終止這個連線。
d) 對端無法到達:與狀態2相同。