第一章 === ### TCP/IP五層架構 - 應用層 : 提供使用者多樣的網路服務 ex : HTTP、SMTP、FTP - 傳輸層 : 決定資料的傳輸模式 ex : TCP -> 會確認封包是否遺失 UDP -> 只負責傳輸資料 - 網路層 : 決定packet傳輸的路徑,以及IP資訊 - 資料鏈結層 : 相鄰網路節點間傳輸資料的協定層,提供流量控制、錯誤檢測等功能 - 實體層 : 制定實體線路的規格、電壓、無線電波的頻率等 ### Delay 種類 - processing delay : 確認封包的bit是否有誤、決定封包的output link - queueing delay : packet在router中等待前面的packet傳送所花的時間 - transmission delay : router把packet放到link上所需的時間 - propagation delay : 實體線路傳輸封包所花的時間 ### Packet Switching vs. Circuit Switching | Packet Switching | Circuit Switching | | -------- | -------- | | 把資料切成一個個資料條(packet)做傳輸 | 建立一個專有通道,進行傳輸 | | 使用共享的傳輸通道| 使用專有的傳輸通道 | | 可同時使用人數多 |可同時使用人數少| | 適合突發性的傳輸需求 | 適合不允許Loss的需求 | ### 專有名詞 - TDMA : 分時多工存取,使用不同的時間片讓多個使用者共用相同的頻率傳送封包 - FDMA : 分頻多重連接,使用不同的頻率讓多個使用者共用相同的時間傳送封包 - Statistical Multiplexing : 統計多工,跟TDM和FDM類似的多工方法之一,它根據使用者的需求分配頻寬 - NAT : 網路位址轉譯,改變封包傳送端或接收端的IP地址(私有IP轉真實IP),減少真實IP的使用量 - LAN : 區域型網路 ex : WiFI - wide-area : 廣域網路 ex : 行動網路基地台 - IXP : 提供ISP和CDN之間的資料傳輸 - routing : 利用routing table決定封包傳送路徑 - forwarding : 將封包從路由器的input移至指定的output(路徑)輸出 - traceroute : 提供source到destination之間,各個Router的delay測量 ### 小知識 - 無線網路的難點: - 反射 - 被阻擋 - 相互干涉 第二章 === ### 通訊協定實際應用 - client-server : HTTP、DNS、FTP - p2p : BitTorrent、VoIP(Skype) - TCP : HTTP、FTP、SMTP - UDP : DNS、VoIP ### 常用通訊協定Port - HTTP:80 - FTP:20、21 - SMTP:25 - IMAP : 143 - POP3 : 110 - DHCP:client : 67、server : 68 ### IMAP與POP3的差別 - IMAP : 會同步電腦和Server上的郵件 - POP3 : 會將Server上的郵件下載到本地,然後刪除Server裡的郵件 ### DNS - iterated query : DNS的所有查詢工作都交給Local DNS完成 ![image](https://hackmd.io/_uploads/ryXXypa7p.png) - recursive query : DNS Server會透過委託的方式請其他DNS Server幫忙查詢,並等待回傳結果 ![image](https://hackmd.io/_uploads/Hys9ypaQ6.png) ### DNS resource records (RR) - 格式 : (name, value, type, ttl) - Type=A : name -> hostname,value -> IPv4 address ex : (office.newnet.com, 220.154.188.185, A) - Type=AAAA : name -> hostname,value -> IPv6 address ex : (office.newnet.com, 6DAA:8B31:4DF5:D403:F972:7058:11C6:4BDA, AAAA) - Type=CNAME : name -> alias name value -> canonical(the real) name ex : (www.ibm.com, servereast.backup2.ibm.com, CNAME) - Type=MX : name -> hostname value -> mail server ex : (example.com, mail.example.com, MX) ### P2P ![image](https://hackmd.io/_uploads/Sygzl6p76.png) ![image](https://hackmd.io/_uploads/ByfXxpTmp.png) - BitTorrent每30秒會隨機挑選1個人加進top-four uploader名單裡,讓沒有貢獻的使用者也能下載到檔案,這種機制稱為optimistically unchoked ### CDN ![image](https://hackmd.io/_uploads/S1e3vI6a76.png) 1. Client端先跟Server端索取manifest file,manifest file裡會有關於CDN的資料 2. Client端會選擇最適合的CDN(距離近、延遲低)來請求檔案 ### 專有名詞 - User Agent : 讓User可以編輯、讀取郵件,以及幫助User將要寄的郵件送到Mail Server - DNS : 負責將域名轉換成相對應的IP地址 - TLD : 頂級網域名稱 ex : .com .org - socket : process和transport protocal之間的接口 - cookie : 透過在client端存放資料來達成stateful的效果 ### 小知識 - SMTP使用persistent connection - RTT 除了transmission delay外都有包含 - FTP使用2個port來進行通訊,分別是data port(20)以及control port(21)或稱command port 第三章 === - Transport Layer主要是探討process和process之間的傳輸 - 我們將Transport Layer的封包稱為segment ### Multiplexing/Demultiplexing - multiplexing : 把不同process的封包匯集到同一條線路輸出 - demultiplexing : 根據線路中封包的資訊分送給不同的process,host是根據IP address和port number來決定demultiplexing的位址 - UDP Server只需要開1個socket進行通訊即可 - TCP Server由於會先建立連線,所以需要1個socket負責建立連線(welcome socket),以及根據使用者連線數量建立的connection socket ### Checksum 1. 先將所有的資料以16bit為一組累加幾來,如果有溢位就把溢位的bit加在最右邊 2. 對累加的結果sum做1補數,將結果保存在checksum欄位裡 3. receiver收到封包後先做累加,並比對累加後的結果是否跟checksum一致(比較bit值或判斷sum和checksum相加是否等於1) ![image](https://hackmd.io/_uploads/S1tojp67p.png) ### UDP header ![image](https://hackmd.io/_uploads/SJij46x8a.png) ### TCP header ![image](https://hackmd.io/_uploads/SkGJSaxIT.png) - Data Offset:指出Data出現的位置,該位置前面就是header資訊 - URG:告訴系統此封包為緊急資料,要盡快接收 - ACK:Acknowledgment Number才有效 - PSH:host會把在buffer的資料直接往上送,不管buffer是否裝滿或順序正確 - RST:表示 TCP 連線中出現嚴重錯誤(對方的port不可用、socket提前關閉等),必須關閉連線 - Urgent Pointer:封包中的緊急資料的最後一個位元組的序號。 ### Reliable Data Transfer (rdt) - rdt2.0 : 使用ACK和NAK告訴sender封包是否有誤 ![image](https://hackmd.io/_uploads/SyyNTTpXT.png) - rdt2.1 : 利用編號的方式預防ACK或NAK封包有錯的情形 ![image](https://hackmd.io/_uploads/SJf_Apa7T.png) ![image](https://hackmd.io/_uploads/rklKCp67a.png) - rdt2.2 : 只用ACK表示封包是否有誤 ![image](https://hackmd.io/_uploads/H1IZy0pQT.png) - rdt3.0 : 增加對封包loss的情形,使用計時的方式解決 ![image](https://hackmd.io/_uploads/BJ341AT7p.png) ### Pipelined protocols - Go-back-N:使用cumulative ack,只需維護一個timer ![image](https://hackmd.io/_uploads/S1_uF6gUT.png) - Selective repeat:每個packet都有自己的計時器,並且需要buffer暫存未排序的封包。如果需要重傳資料只需傳沒有收到ACK的封包就好 ![image](https://hackmd.io/_uploads/SkT8qagIa.png) Selective repeat的sequence size需要>=2 * window size,否則會出現封包無法辨識的問題 ![image](https://hackmd.io/_uploads/S19AqaxLa.png) - TCP Pipelined:使用cumulative ack,但重傳只傳第一個遺失的封包 ### TCP timer 計算方式 ![image](https://hackmd.io/_uploads/r1eIsTlUT.png) ![image](https://hackmd.io/_uploads/SJs6haeU6.png) ### TCP 特別功能 - fast retransmit:如果收到3個重複的ACK(也就是4個一樣的封包),就會直接重傳該封包 - flow control:receiver會告訴sender自己緩衝區的容量情況,以免sender把receiver的緩衝區灌爆! ![image](https://hackmd.io/_uploads/B1wm06x8p.png) - congestion control:TCP會根據當前網路的運作情況,調整windows的大小,以免網路塞車 - sender的window size是由flow control和congestion control的最低值決定 ### TCP congestion control 階段 - slow start:MSS從1開始,每收到1個ACK MSS就+1(指數成長),直到到達threshold為止 - congestion avoidance:MSS以線性速度增加(收到全部的ACK才將MSS +1) - 如果出現3 duplicate ACK,先將threshold設為cwnd / 2,然後分以下兩種版本 - Tahoe:cwnd設為1,然後回到slow start階段 - RENO:cwnd設為更新後的threshold + 3,然後回到congestion avoidance階段 - 如果出現超時,一律將threshold設為cwnd / 2、cwnd設為1,然後回到slow start階段 第四章 === - network layer主要是探討router跟router之間的傳輸 - 我們將network layer的封包稱為datagram ### router兩大功能 - routing:利用一些演算法決定路徑,建立forwarding table (Data plane) - forwarding:根據forwarding table將router的input移至對應的output (Control plane) ![image](https://hackmd.io/_uploads/rJoV4Ub8p.png) ![image](https://hackmd.io/_uploads/BJjpVI-UT.png) ### Switching fabrics 類型 - memory:使用記憶體複製封包的方式執行forwarding,透過CPU指令操作 - bus:使用共享的匯流排做forwarding,會有爭搶資源的情形 - crossbar:建立多個share bus,減少爭搶資源的情況 ![image](https://hackmd.io/_uploads/HJBQ8UZU6.png) ![image](https://hackmd.io/_uploads/S1LqLI-Ip.png) ### Scheduling mechanisms - discard policy - tail drop:最後來的先丟棄 - priority:根據優先權丟棄封包 - random:隨機丟棄封包 - priority scheduling - 一般類型:先將優先權高的封包送完,再送優先權低的封包 ![image](https://hackmd.io/_uploads/ryHhwU-UT.png) - Round Robin (RR):輪流送封包 ex:先讓紅色送再換綠色送 ![image](https://hackmd.io/_uploads/B1L1OIbLT.png) - Weighted Fair Queuing (WFQ):Round Robin的改良版,有權重優先權的輪流送封包 ![image](https://hackmd.io/_uploads/S11__8bLT.png) ### IP header ![image](https://hackmd.io/_uploads/SJcmFIZLp.png) - Flage - 第一位:保留位元,必須為0 - 第二位:don’t fragment - 第三位:more fragment - Fragment offset:每個fragment相對於原始封包開頭的偏移量,以8 Byte為單位。 ### DHCP ![image](https://hackmd.io/_uploads/SymijUZLp.png) ### NAT ![image](https://hackmd.io/_uploads/rJ3xlwZL6.png) ### IPv6 header ![IPv6](https://hackmd.io/_uploads/rJQOxKZU6.png) - next header:功能與IPv4的Protocol相同 - hop limit:功能與IPv4的TTL相同 ### 專有名詞 - CIDR(Classless InterDomain Routing):無類別區間路由,IP address前面一部分長度代表subnet,長度大小隨意 ### 小知識 - 我們要自己設定host的Router IP地址,或是DHCP在分配IP時也會傳遞IP資訊 - Router的output interface是由人設定的,所以router知道output路徑的router ip地址 第五章 === 通靈問題 === (F) ![image](https://hackmd.io/_uploads/Sk86ZdR7p.png) (F) ![image](https://hackmd.io/_uploads/HyVgGu0m6.png)