title: 'tcp:為了連線我真的是竭盡全力'
tags:
tcp很多東西很複雜,因為在複雜的網路世界裡什麼都是可能發生的,於是我們為了通訊的可靠,在傳輸層設計一種十分可靠的傳輸協議來進行可靠的傳輸。
udp之所以簡單,是因為它像小孩子一樣相信網路世界是美好的,發出去的包不會丟失,也不會擁堵,發出去也就不管了。
而實際上網路世界裡很複雜,有很多複雜的情況。
tcp是大人了,所以它為了支援可靠的傳輸,費心費力。
源埠號和目的埠號是必不可少的。
除此之外,還有序號、確認序號、狀態位、視窗大小、緊急指標等。
由此我們著重看tcp的以下問題:
所有問題都是從連線開始的,tcp就是這樣,要幹什麼事,先連線再說。
tcp為什麼不是兩次握手,又或者四次握手。為什麼三次握手就夠了呢。
首先不要被握手兩個字迷惑了,以為是面對面連線呢?
在網路世界裡,就像古時候信鴿傳信一樣,你發出去了啥問題都可能發生,你唯一知道結果的就是傳回來的確認包是啥樣的。
因此三次握手建立連線,我們雙方都得是有去有回。也就是說彼此都能確定自己發的東西對方能收到。
假設a要與b建立連線,a跟b傳送乙個syn連線請求:b你在嗎?實際情況就是a沒收到b的回覆會一直傳送請求來騷擾
b收到a的連線請求,回覆乙個ack:我在。如果b不想理a,a騷擾一段時間後就走了
這時候a收到回覆,就知道自己發的東西b能收到,那麼單方面就建立連線狀態了,但是b沒有一去一回啊,所以還得給b發個確認的確認:你好呀,b。
b收到確認的確認,也知道自己有去有回,也建立連線了。
實際上,確認的確認在網路裡跑的時候也可能丟失,b一直收不到確認的確認不建立連線怎麼辦呢?b也可以反**確認。事實上,大部分情況下,a收到回覆後單方面建立連線了,會馬上給b發資料,這個時候,就算確認的確認沒辦法到b,b收到a傳送的資料,也會馬上和a建立連線。
但是如果a就是無賴,建立連線後就是不發資料怎麼辦?作為服務端b,可以開啟keepalive機制,又探活包,對於a這種長時間不傳送資料的客戶端,可以主動關閉連線。
不想玩了,a和b之間解散更加複雜,要四次揮手。
a和b說:我不想玩了,你趕快幹完你的事。之後a進入fin-wait-1階段。
b收到後,跟a說:哦,我知道了。之後b進入closed-wait階段。這個時候a收到b的回覆之後會進入fin-wait-2階段。
b也不想玩了:a,我也不想玩了。之後b進入last-ack階段,等待a的最後回覆
a終於收到了b也不想玩的訊息,愉快的傳送:好的,拜拜。之後a進入time-wait階段,等待一段時間後關閉。b如果收到了a的回覆就會關閉。
其實也是有去有回的原理,但是關閉連線的過程涉及到工作的問題。那麼雙方各自來一段有去有回,也就是四次了。
a單方面不想玩了,跟b發了訊息後,會進入fin-wait-1階段,b得給a發個回覆,a收到後進入fin-wait-2階段,這個時候a不能馬上關閉呀,因為b有它自己的工作,b還可能傳送資料,只是這時候a可以選擇接受不接受。
a這時候的狀態就是我給你傳送了我不想玩的訊息,而且我確認你已經收到了,a的有去有回已經完成,就等b的不想玩了。
終於b也不想玩了,跟a發:我也不想玩了。這時候b不能關閉,因為b的有去有回還沒有完成。
a終於收到,奶奶個熊,你終於擦完你的屁股了,愉快的回覆:好的,拜拜您嘞。注意這個時候a還是不能馬上關閉,因為b可能收不到回覆,b會重新傳送b不玩了,這個時候a要重新傳送回覆,因此要等待一段時間。
另外a馬上關閉還有乙個問題就是,a的埠空出來了,這個時候b不知道,b原來傳送的很多包可能還在路上,這個時候會送到別的占用埠的應用。就混亂了。
一般來說,流量控制雙方傳送資料的速度與大小。
tcp的順序問題,丟包問題,流量控制實際上都是通過一種叫滑動視窗的機制來實現的。
滑動視窗分為兩種,傳送視窗,與接收視窗。
滑動視窗通過指標來實現,把資料流分成了四個部分:
其中如果出現了丟包問題,為了保證順序以及資料的可靠性,會有超時重傳的機制:
tcp的擁塞控制的目的在於為了不把網路塞滿。
注意,擁塞控制不能避免出現擁塞的情況,只是為了在不丟包、不堵塞的情況下,盡可能得發揮頻寬。
擁塞控制也是通過設定乙個視窗值來實現的,只是叫擁塞視窗,是在把資料傳送到網路中的層面上來講的。
主要是四個方面:慢開始、擁塞避免、快重傳、快恢復。
tcp就是用擁塞控制來知進知退,但是如果時延很重要的情況下,反而降低速度。
主要是兩個問題:
針對這兩個問題,後面有tcp bbr擁塞演算法。試著找乙個平衡點,不斷地加快速度,但是不把中間裝置的快取填慢,這樣努力達到高頻寬和低時延的平衡。
這次我是真的受了傷
對於我來說,最大的傷害莫過於被人誤解。因為很多年前,我被人誤解著過完了黑色的高中三年,那是一段讓人難以忘卻的充滿憂鬱的日子。在大學四年裡,我努力著忘掉過去,忘掉憂傷,治好了自己的憂鬱症。今年是我參加工作的第二個年頭,生活很平靜,因為我對所深愛的程式設計事業的執著和熱愛,因為我帶著感恩的心,因為我帶著...
內連線真的坑,sql引入外連線是有原因的
做專案需要通過白班 夜班兩張檢視寫出一張日合計檢視。一開始用的是 select 白班.欄位 夜班.欄位 as 日合計 欄位 from 白班,夜班 where 白班.日期 夜班.日期 這樣搞就很難受。當有一天有乙個欄位有白班沒夜班或者有夜班沒白班,這個欄位就不會出現在日合計裡面。這時候我明白了sql引...
別看我長個熊樣,我真的是只老鼠
聯合國組織了一次測試,就是放乙隻帶標識老鼠到乙個城市中,請各國在最短的時間內找出這個老鼠 a國動用數萬名武裝整齊的官兵,對整個城市進行地毯式搜尋,說是七天內找到了,b國組織了十人小分隊,對各地進行宣傳,有賞捉老鼠,結果,3天時間就找到了,c國動用了數噸美味以 結果,僅用了1天時間就找到了 d國研製出...