社區專欄>tcp需要熟練掌握的概念>
總體概念
- 三次握手
- 四次揮手
- 滑動窗口
- 超時重傳
- 流量控制
- 擁塞控制
- 報文段最大
- 粘包現象(UDP沒有,因為面向消息傳送,不需要等待到一定程度才能發包,Nagle算法)
- RTT 往返延時
三次握手
- client: syn,client初始化序列號
- serverack(序列號+1),syn(server初始化序列號)
- client: ack(序列號+1)
傳輸
- client: ack(序列號+1),傳輸數據(PSH),client初始化序列號+1
- server: ack(client初始化序列號+1+字節數),傳輸數據(PSH),server初始化序列號+1
四次揮手
粘包
- Nagle算法:會等待有ack返回才會進行發送,也就是所有數據要發送之前,都會緩存。知道接收一個ack的包。
- 解決方式: 發送方關閉nagle算法,或者約定好數據協議,比如設置分隔符,接著加上多少個字節表示這個分組的大小。
socket
- 理解為一個文件標識符fb建立和內核數據結構的聯系,只需要把這個fb的標識符,就可以索引到底層的socket的數據結構,socket的數據結構有普通的,同一個進程之間的通信,也有網絡連接的通信。有個指針,保存了緩存的數據,包括了要發送的數據和接收的數據。
- socket(),bind(),listen(),accept(),recv(),close()
- socket(),connect(),send(),close()
重傳機制
- 超時重傳
- 快重傳
- sack重傳(選擇性重傳),需要雙方都開啟表示,tcp有個字段是sack,可以指明接收方已經接收哪部分的數據
- Duplicate SACK
滑動窗口
- 累計應答
- 滑動窗口左移的字節和返回的ack有關
- 流量控制里面使用的窗口,認為本次的緩存,還剩下多個窗口可以使用,一個窗口一個字節
- 發送方,三個指針,SND.WND、SND.UN、SND.NXT
- SND.WND:表示發送窗口的大小(大小是由接收方指定的)
- SND.UNA:是一個絕對指針,它指向的是已發送但未收到確認的第一個字節的序列號
- SND.NXT:也是一個絕對指針,它指向未發送但可發送范圍的第一個字節的序列號
- RCV.WND:表示接收窗口的大小,它會通告給發送方
- RCV.NXT:是一個指針,它指向期望從發送方發送來的下一個數據字節的序列號
總結
- mss最大的1460-12(時間戳)= 1448
- 發送是tcp報文發送。也是發送的單位
- 滑動窗口是構建報文之前的窗口,基本由接收方確認。這里的窗口的單位是字節
- 首先選擇滑動窗口的數據,封裝成tcp報文段,放到緩存中,使用nagle算法,確認之后發送。tcp報文段有個16字節的窗口(65535個字節)
- ack使用的是seq+字節數作為返回確認。sack返回已經接收到斷層的字節數,返回重復接收的字節端
- tcp報文段可不一定是mss出來

肥料

肥料
總體概念
- 三次握手
- 四次揮手
- 滑動窗口
- 超時重傳
- 流量控制
- 擁塞控制
- 報文段最大
- 粘包現象(UDP沒有,因為面向消息傳送,不需要等待到一定程度才能發包,Nagle算法)
- RTT 往返延時
三次握手
- client: syn,client初始化序列號
- serverack(序列號+1),syn(server初始化序列號)
- client: ack(序列號+1)
傳輸
- client: ack(序列號+1),傳輸數據(PSH),client初始化序列號+1
- server: ack(client初始化序列號+1+字節數),傳輸數據(PSH),server初始化序列號+1
四次揮手
粘包
- Nagle算法:會等待有ack返回才會進行發送,也就是所有數據要發送之前,都會緩存。知道接收一個ack的包。
- 解決方式: 發送方關閉nagle算法,或者約定好數據協議,比如設置分隔符,接著加上多少個字節表示這個分組的大小。
socket
- 理解為一個文件標識符fb建立和內核數據結構的聯系,只需要把這個fb的標識符,就可以索引到底層的socket的數據結構,socket的數據結構有普通的,同一個進程之間的通信,也有網絡連接的通信。有個指針,保存了緩存的數據,包括了要發送的數據和接收的數據。
- socket(),bind(),listen(),accept(),recv(),close()
- socket(),connect(),send(),close()
重傳機制
- 超時重傳
- 快重傳
- sack重傳(選擇性重傳),需要雙方都開啟表示,tcp有個字段是sack,可以指明接收方已經接收哪部分的數據
- Duplicate SACK
滑動窗口
- 累計應答
- 滑動窗口左移的字節和返回的ack有關
- 流量控制里面使用的窗口,認為本次的緩存,還剩下多個窗口可以使用,一個窗口一個字節
- 發送方,三個指針,SND.WND、SND.UN、SND.NXT
- SND.WND:表示發送窗口的大小(大小是由接收方指定的)
- SND.UNA:是一個絕對指針,它指向的是已發送但未收到確認的第一個字節的序列號
- SND.NXT:也是一個絕對指針,它指向未發送但可發送范圍的第一個字節的序列號
- RCV.WND:表示接收窗口的大小,它會通告給發送方
- RCV.NXT:是一個指針,它指向期望從發送方發送來的下一個數據字節的序列號
總結
- mss最大的1460-12(時間戳)= 1448
- 發送是tcp報文發送。也是發送的單位
- 滑動窗口是構建報文之前的窗口,基本由接收方確認。這里的窗口的單位是字節
- 首先選擇滑動窗口的數據,封裝成tcp報文段,放到緩存中,使用nagle算法,確認之后發送。tcp報文段有個16字節的窗口(65535個字節)
- ack使用的是seq+字節數作為返回確認。sack返回已經接收到斷層的字節數,返回重復接收的字節端
- tcp報文段可不一定是mss出來