1:tcp建立連線需要三次握手, 斷開連線時需要四次揮手
2:用連續arq協議(gbn, 選擇確認)
3:流量控制
4:擁塞控制
第一次握手: 客戶端向伺服器端傳送syn報文段, 並隨機生成乙個序號seq=client一起發給伺服器端, 傳送之後客戶端變為syn_sent狀態。
第二次握手:伺服器收到了包含tcp syn報文段的ip資料報之後, 伺服器抽取出syn報文段, 並為tcp快取和變數,並向客戶端傳送允許連線的報文段。 伺服器傳送syn=1, ack=seq, 並生成自己的序號sever一起傳送。
(syn洪氾攻擊就是利用第二次握手伺服器為tcp連線分配快取和變數實現的。)
第三次握手:客戶端收到了來自伺服器端的syn報文段, 變為established狀態, 也為tcp分配快取和變數(因為tcp是全雙工的),因為連線已經建立了,所以傳送給伺服器端的報文段syn=0, seq=client+1,ack=sever。 第三次握手階段可以在報文段負載攜帶客戶到伺服器的資料。
為什麼是三次握手而不是兩次
防止已經失的請求報文段在延遲傳到之後引起資源浪費。
例:若a向b發起請求tcp連線, 因為某種原因,該tcp syn報文段在乙個網路節點逗留了很長時間, a以為該tcp syn報文段丟失, 又重新傳送了乙個並成功建立tcp連線, 完成資料傳送之後斷開連線, 之後第乙個tcp syn報文段到達b, b就為a的tcp連線分配快取和變數,之後一直等待a傳送資料, 但此時a不知道與b建立連線, 引起了資源浪費。
客戶端要斷開tcp連線, 需要向伺服器傳送標誌位fin=1的報文段,客戶端之後不能再向伺服器端傳送資料, 但可以從伺服器端接收資料
伺服器端收到此報文段後, 傳送乙個ack表示自己已經收到。
等待伺服器端沒有資料傳送給客戶端的時候, 伺服器端向客戶端傳送乙個含有fin=1的報文段
客戶端收到後向伺服器端傳送ack報文段, 等待2msl(最長報文壽命的兩倍)後關閉tcp連線, 而伺服器端一收到客戶端的ack就立刻關閉tcp連線, 所以伺服器端結束tcp連線會比客戶端早一點
因為tcp是全雙工協議, 客戶端向tcp傳送fin=1報文段只能說明客戶端沒有資料傳送給伺服器端了, 而不知道伺服器端是否還有資料傳送給客戶端, 所以伺服器端在收到客戶端的fin, 先傳送乙個ack給客戶端來表示自己已經收到了客戶端的fin報文段, 等待伺服器端沒有資料要傳送給客戶端時再向客戶端傳送fin報文段,因為此時還沒有資料能傳送, 所以tcp建立連線時的syn和ack是一起傳送的,所以是三次握手, 四次揮手。
1:防止客戶端的ack丟失。
若客戶端傳送完ack立刻關閉tcp連線並且ack丟失, 伺服器端無法正常關閉。
而若客戶端傳送完ack等待2msl的時間再關閉, 這時客戶端的ack丟失, 伺服器端可以重新傳送fin給客戶端, 客戶端重新傳送ack來正常關閉連線。
2:防止已失效的報文段到達了重新建立的tcp連線中
客戶端不等待2msl就直接關閉tcp連線, 若此時網路中還有資料報,並且新建立的tcp連線的埠號與上一次一樣, 則上一次未接收的報文段會到達新建立的tcp中。
解決傳送端和接收端吞吐量不匹配, 若傳送方的傳送速度大於接收方的接收速度, 等到接收方的快取滿了之後, 報文段就會丟失。
用幾個變數來實現:
lastbyteread: 接收方的應用程序從快取中讀出的資料流的最後乙個位元組的編號。
lastbytercvd: 從網路中到達的並且放進接收方快取的資料流的最後乙個位元組的編號。
rcvbuffer: 接受快取的大小。
rwnd: 接收視窗的大小。
tcp不允許已分配的快取溢位,所以
lastbytercvd - lastbyteread <= rcvbuffer
rwnd = rcvbuffer - (lastbytercvd - lastbyteread )
防止過多的資料注入網路, 導致網路過載。
擁塞控制是全域性的, 而流量控制是點對點的。
慢開始:
一開始傳送小的資料, 由小到大的增加擁塞視窗。 每收到接收方的確認, cwnd就加倍。
擁塞避免:
設定乙個慢開始門限ssthresh,
當cwnd < ssthresh 用慢開始演算法
當cwnd = ssthresh 兩種演算法都可以
當cwnd > ssthresh 用擁塞避免演算法
快重傳和快恢復
重傳分為兩組 , 一種為超時重傳, 一種為快重傳。
快重傳: 當連續收到三個冗餘ack時, 不必等到計時器時間到直接重傳未成功接收的報文段。
快恢復:當出現超時重傳或者快重傳,tcp把cwnd設為原來的一半, 並把新的cwnd的值賦給ssthresh, 然後執行擁塞避免演算法。
TCP與UPD知識總結
1 udp udp是面向訊息或面向資料報的協議。udp把應用程式一次性寫入的資料打包成乙個udp資料報,然後就把該資料報通過ip傳送出去,接收方收到的也是同樣的乙個udp資料報,即這個資料傳輸的過程是以資料報作為單位的。udp保持了每次應用程式所傳送的訊息的邊界。2 tcp tcp資料傳輸的過程並不...
TCP和UDP知識總結
1.tcp粘包 tcp是面向連線 流式傳送的,沒有明確的邊界定義。他有乙個緩衝區,每過一段時間或者快取滿了就傳送出去,造成一次傳送的資料可能是多個包或者包的一部分,這就是傳送端的粘包。接收端的粘包指應用程式沒有及時處理緩衝區中的資料,後續到達的資料繼續放到快取中。解決方法 a.對傳送的資料劃分邊界,...
TCP傳輸控制協議知識總結
面向連線。tcp提供客戶端與伺服器端的連線。tcp的連線是點對點的。可靠性。有序性。tcp通過給所傳送的資料的每乙個位元組關聯序列號進行排序,通過tcp連線傳輸的資料,無差錯,不丟失,不重複。面向位元組流,並且提供流量控制。tcp總是告訴對方它能接收多少位元組的資料 視窗 全雙工。既可以傳送資料也可...