# 計算機網路筆記-ch3 socket : 一種OS提供的procceses通訊機制。應用層可以透過API socket來使用網路socket,以進行資料交換。 ## Transport service and protocol Transport layer 提供了應用層裡processes在不同host中的logical communication. Sender會將應用層的message切成一塊一塊的segments,並往網路層傳送。 Receiver則會將segment重組為message,並往應用層做傳輸。 ![](https://i.imgur.com/AQozfmK.png) 可以把hosts比喻為一個家,而process就如同是家裡面的kids,app messages就是信封裡面的letters。 當今天小孩們(process)要互相傳遞信件給對方,小孩們會先將信封交給Ann(老大),藉由他們將信件拿到郵局寄,郵局再將信封傳遞到另一個家庭,Bill(老大)則將信封依照姓名(prot number)發給小孩們(processes)。 ### Network Layer : logical communication between <font color = red>**host**</font> ### Transport Layer : logical communication between <font color=red>**process**</font> ### TCP VS. UDP * TCP : 1. 可靠的, 按照順序的傳輸 2. 有congestion control 3. 有flow control 4. 有連線建立 * UDP : 1. 不可靠的, 傳輸不會按照順序 2. 只要收到資料就盡全力的傳輸 * 兩個protocol皆不包含delay保證 與 頻寬保證 等等。 ## Multiplexing/demultiplexing ### multiplexing at sender multiplexing at sender : 收集多個多個socket的資料,用header(稍後將用在解多工)將每個messages片段封裝成segments。 demultiplexing at receiver : 利用header的資訊去傳遞received segment到正確的socket。 ### How demultiplexing works host receives IP datagrams, 每個datagram 都有 source IP 跟 destination IP。 每個datagram也會包含一個segment, 每個segment中都會包含一個source port number 跟 destination port number。 ![](https://i.imgur.com/OGYWVcb.png) ### host 使用 IP address & port numbers 去找到正確的socket 當我們要傳送資料時,我們會先建立一個有標明host-local port num的socket。(以port number去產生socket) 當要建立Datagram去傳進UDP socket時,必須標明IP address跟port#。 當host收到UDP segment時會透過segment裡的destination port#將segment送到指定的socket。(利用IP與prot number去識別UDP socket) 不同來源的source port numbers 或 IP addresses,只要是同一個destination IP address 與 port numbers,就都會傳遞到同一個socket。 ### Connection-oriented demultiplexing TCP socket 會有 1. source IP address 2. source port number 3. dest IP address 4. dest IP address demux : receiver 利用以上四個元素去傳送segment到指定的socket。 當今天有很多的segment指定要到同一個dest port number,server會支援許多同時可以使用的TCP sockets。 ![](https://i.imgur.com/xBv6G2r.png) ### UDP<font color=red>在demultiplexing時只有使用destination port number(only)</font> TCP 在demultiplexing時會用到4個元素, 而UDP就只用dest port#(header中會有src與dest的port#)。 ## UDP: User Datagram Protocol 1. no frills, 沒有多餘設計的Internet transport protocol 2. best effort, 盡力的服務,但不可靠 3. 會造成封包遺失、傳遞順序不正確 4. UDP傳遞間沒有hand-shacking 5. 每個UDP segment都是獨自處理的 ## 為什麼要用UDP呢 1. no connection, 可以省去建立連線時的RTT delay 2. simple, 沒有連線狀態 3. small header size 4. no cogestion control, UDP不會管接收端的接收狀況,他會一直拼命的快速傳遞,導致常常可能封包遺失,但UDP不會有congestion的問題。可以利用這點來處理congestion的問題。 ## UDP的應用 1. 多媒體串流(可以容忍遺失,但對於速率有要求) 2. DNS 3. SNMP(Simple Network Management Protocol) 4. HTTP/3 ### 由於下層沒有服務(如congestion control),上層要自己加 1. add needed reliability at application layer 2. add congestion control at application layer ### UDP傳遞流程 sender actions: 1. 應用層會送message下來 2. 決定UDP segment 的 header 要放甚麼 3. 創造UDP segment 4. 將segment往網路層送 receiver actions: 1. 由網路層拿到segment 2. 進行UDP checksum 3. 取出應用層的message 4. 藉由socket將訊息解多工到應用層 ### UDP 結構 ![](https://i.imgur.com/0yHqCQ8.png) ### UDP checksum 目的: 為了偵測傳遞時是否有傳遞錯誤 ![](https://i.imgur.com/T7mCUiI.png) sender會將segment(包含UDP header 跟 IP address)分成一列一列(一列16-bit)。接著會將他們全部做相加,如有overflow會再將overflow與sum做相加,最後再取1補數作為checksum。checksum value會放在UDP的header中的欄位裡。 receiver收到segment後,會先計算收到的segment的checksum,接著再看看是不是與header內的checksum相符。相符:代表應該沒有error(實際上還是有可能會有,因為加法不是一個很好的方式),不相符:偵測到error。 ![](https://i.imgur.com/FBtoZ7D.png) ![](https://i.imgur.com/1TEdFoJ.png) ## Principles of reliable data transfer Characteristics of unreliable channel will determine complexity of reliable data transfer protocol (rdt)。 ![](https://i.imgur.com/WQ1tmlF.png) ![](https://i.imgur.com/SzKInI2.png) ### rdt 1.0 使用可靠通道的可靠傳輸。 1. 沒有bit error 2. 沒有資料遺失 ### rdt 2.0 可能產生位元錯誤的通道。 會利用 ACKs 與 NAKs 來確定資料的傳送有無錯誤。 當收到NAKs時,會重新傳送封包。 ### rdt 2.1 改善2.0致命的缺點 -- ACK/NAK 有可能會損毀(garbled、corrupted)。 改善方法: 1. 如果ACK/NAK損壞了,傳送端會重新傳送封包 2. 傳送端會在每個封包加上sequence number 3. 接受端會刪掉重複(duplicate)傳遞的封包 ### rdt 2.2 與rdt2.1一樣的功能,但只使用ACK。 1. 接受端須明確地加上經過確認封包的序號 2. 傳送重複序號的ACK => NAK,會重新傳送封包 ### rdt 3.0 由於底層頻道可能會遺失封包,所以利用timer來倒數計時。 1. 時間內,無收到ACK,會重傳封包 2. 忽略掉duplicate的封包或ack 使用率(utilization)極差。 ![](https://i.imgur.com/zwzdtJA.png) ### Pipelined protocols 管線化 : 可以同時傳遞多個還沒有被確認的封包。 1. range of sequence numbers must be increased 2. buffering at sender and/or receiver 3. Two generic forms of pipelined protocols: go-Back-N, selective repeat utilization稍好一點(EX:增加3倍)。 ![](https://i.imgur.com/NbmfZO5.png) ### GO-BACK-N Sender: 大小最多為N的window、允許連續的(consecutive)未被確認的封包。 ![](https://i.imgur.com/36RUbW9.png) “comulative ACK” - ACK(n) : 確認**小於或等於**序號 n 的所有封包。 1. timer for **oldest** in-flight packet。 2. timeout(n) : retransmit **packet n and all higher seq# packets in window**。 Receiver: 1. 只使用ACK 2. 只接受in-order seq#的封包,並傳送ACK 3. 只需記住expectedseqnum 處理out-of-order的封包: 1. 刪除(不buffer)順序亂掉的封包 => receiver<font color=red>沒有暫存器</font> 2. reACK packet with highest in-order seq#(回傳最後一個確認的ack) ![](https://i.imgur.com/1W4xGTz.png) ### Selective Repeat 1. Receiver individually acknowledges all correctly received pkts (接收端分別確認所有正確接收的封包) 2. Buffers pkts, as needed, for eventual in-order delivery to upper layer (依需要暫存封包、 最終會依序傳送到上一層) 3. Sender only resends pkts for which ACK not received 4. Sender timer for each unACKed pkt 5. Sender window傳送端視窗 : ƒN consecutive seq #’s (N 個連續的序號) ƒ Again limits seq #s of sent, unACKed pkts (再次、用來限制傳送出去的、 未確認的封包序號) ![](https://i.imgur.com/x0lkJ2t.png) ![](https://i.imgur.com/eYxdl3W.png) ![](https://i.imgur.com/KGhKX8U.png) ![](https://i.imgur.com/D4jiXc8.png) ## TCP(connection-oriented transport) 1. point-to-point(one sender, one receiver) 2. reliable, in-order byte stream 3. pipeline(TCP congestion and flow control set window size) 4. send & receive buffers 5. full duplex data(bi-directional data flow in same connection) 6. connection-oriented(handshacking initializes sender, receiver state before data exchange) 7. folw controlled ### TCP seq. #’s and ACKs * sequence number of a segment is the sequence number of the first byte in the data field * segment的sequence number是data內第一個byte的sequence number * 另解 : 要傳出的segment's data裡第一個byte在byte stream裡的number * ACK is the sequence number of the next byte of data that the host is waiting for * ACK是host正在等待的下個data中第一個byte的sequence number * 另解 : 下一個預期會從另一端收到的第一個byte的seq # ### 互相傳遞"CIA" (必考) ![](https://i.imgur.com/V10jmES.jpg) ### TCP RTT, time out #### how to set TCP timeout value? * longer than RTT (but RTT varies) * too short : premature timeout (unnecessary retransmission) * too long : slow reaction to segment loss #### how to estimate RTT? * SampleRTT (測量傳遞到接收確認的時間,不包含重傳) * 由於SampleRTT will vary, 所以需要做點平均讓他平滑 ![](https://i.imgur.com/03C3DhY.png) ![](https://i.imgur.com/Yy8rT67.png) ### TCP Sender ![](https://i.imgur.com/mGsdrJb.png) ![](https://i.imgur.com/gJ6FVAs.png) ![](https://i.imgur.com/cMnMldB.png) ### TCP fast retransmit ![](https://i.imgur.com/NSpHCoB.png) 當中間有封包遺失,receiver會接受到不符合預期的封包,receiver會send重複的ACK(原先預期的封包)。當sender收到3次重複的acks時,他不會等timer,還是直接重傳。 ## TCP flow control ![](https://i.imgur.com/cZgPQry.png) 在傳輸層中有TCP socket receiver buffers,用來暫存網路層傳來的資料,與讓應用層存取並刪除資料。 但我們必須做流量控制,不然可能會因送太快,應用層來不及拿走,buffer就滿到不能再存,進而遺失資料。 ![](https://i.imgur.com/u3yhOn0.png) 透過TCP segment結構的header-receive window來告訴sender RcvWindow。 RcvWindow = RcvBuffer-[LastByteRcvd - LastByteRead] ## Congestion Control * 太多sources同時傳遞太快且太多資料導致網路無法handle * 會導致較長的delay或是封包遺失 * end-end congestion control * 利用推斷loss跟delay,去得知是否擁塞 * TCP採用的方法 * Network-assitsted congestion control * routers會直接將擁塞的資訊透過經過的封包告訴傳送端與接收端 ### AIMD ![](https://i.imgur.com/AdHKUFX.png) * additive-increase/multiplicative-decrease * 方法 * 將傳送速率再每個RTT都增加1個MSS(Max Segment Size)直到發生loss * 當偵測到loss的時候 * 如果是收到到3次重複的ACK => rate/2 * 如果是因為timeout => 降成1MSS ### TCP slow start ![](https://i.imgur.com/7fHDGtY.png) * 連線的初期,讓rate指數性成長 * 一開始Cwnd = 1MSS * 每個RTT都會將Cwnd*2 * 每收到1個ACK,Cwnd就會增加一個MSS,傳出兩個MSS ### TCP 的 congestion control ![](https://i.imgur.com/YBV2a8g.png) * ssthresh : slow start threshold 門檻值 * 當 Cwnd 低於 ssthresh,sender使用slow start,指數成長 * 當 Cwnd 高於 ssthresh,sender會進入congestion-avoidance,線性成長 * 當 偵測到loss時 * 如果是收到到3次重複的ACK => ssthresh會被設成Cwnd/2,Cwnd會設成ssthresh+3 MSS * 如果是因為timeout => ssthresh會被設成Cwnd/2,Cwnd會降成1MSS ###### tags: `計算機網路`