1.序列號初始值=固定定時(shí)變化的32位無符號值(每隔一段時(shí)間+1)+hash(兩個(gè)端口號+兩個(gè)ip+協(xié)議號(tcp或者udp號)捞蚂,這就代表序列號永遠(yuǎn)在0-2的31次方直接循環(huán)
2.由于1的問題導(dǎo)致比如出現(xiàn)序列號溢出拉庵,進(jìn)而導(dǎo)致序列號回繞窿吩。
3.由于回繞的存在蜻拨,會出現(xiàn)以下兩個(gè)問題插爹,1).對于tcp包排序是按照序列號大小排序的情妖,這個(gè)怎么辦码秉。2).對于因?yàn)榘舆t而導(dǎo)致可能出現(xiàn)一個(gè)延遲包和一個(gè)新的包的序列號一樣怎么辦。
4.對于3的1問題:由于比較值采用的(有符號)(無符號序列號1-無法序列號2)矮燎。比如當(dāng)前待確認(rèn)的序列號是0归粉,那么對于32位無符號數(shù)中是4294967296,2的31次方都是大于0的有2147483648漏峰,則1到2147483648都是新增數(shù)據(jù),后面都是回繞數(shù)據(jù)届榄。只要回繞的幅度小于2147483648浅乔,則都可以處理。也就是說tcp認(rèn)為是新包還是過期的舊包則是依賴于當(dāng)前以及確定的序列號铝条,即大于當(dāng)前序列號小于當(dāng)前序列號+2的31次方都是新包靖苇,其他的都是舊包。
5.對于3中的第二個(gè)問題班缰,則可以依靠時(shí)間戳的來判斷贤壁,去除距離當(dāng)前時(shí)間最大的時(shí)間戳,保留最新的埠忘。
6.對于4的解答脾拆,如果一旦回繞幅度一下子超過2的31次方怎么辦,這個(gè)時(shí)候時(shí)間戳就能輔助解決了莹妒?名船,那是因?yàn)閠cp窗口最大是2的30次方,所以不會超過回繞幅度旨怠。但是為啥是2的30次方卻采用32bit渠驼。
【這段內(nèi)容為本人理解,非書中原文】TCP需要保留一半的序號用于判斷是否是以前的舊數(shù)據(jù)段鉴腻,(232-1)/2<231迷扇,也就是現(xiàn)在用于處理新數(shù)據(jù)段小于2^31個(gè)百揭;假如窗口大小為wnd,發(fā)送方第一次發(fā)送[0蜓席,wnd-1]一個(gè)窗口的數(shù)據(jù)器一,這時(shí)接收方收到數(shù)據(jù),并統(tǒng)一發(fā)送一個(gè)ack確認(rèn)這個(gè)窗口的數(shù)據(jù)瓮床,確認(rèn)完之后盹舞,窗口移動準(zhǔn)備接收[wnd, 2wnd-1]段的數(shù)據(jù);若發(fā)送方如果沒有收到這個(gè)ack隘庄,需要重傳[0, wnd-1]的數(shù)據(jù)踢步,若收到了ack,則發(fā)送[wnd, 2wnd-1]的數(shù)據(jù)丑掺,這兩種情況下获印,接收方都需要滿足序號,也就是序號需要滿足2wnd街州;前面說了序號的一半用于新數(shù)據(jù)吭露,也就是2wnd<231,wnd<230饲常,即(216-1)*2shif < 2^30涯呻,得出shift<=14,即除了TCP首部的16bit面徽,這里最多也就是30-16=14bit艳丛;
————
1.對于當(dāng)前確認(rèn)序號為1但是收到了上一條流數(shù)據(jù)為2的包,則必須開啟timestamp才能解決趟紊,其對每個(gè)包的時(shí)間必須大最新確認(rèn)的序列時(shí)間才會接受氮双。
2.對于重傳包和回繞包要一樣大或者比回繞包大的情況,因?yàn)榇翱诖笮∠拗?此時(shí)最新的確認(rèn)時(shí)間戳肯定比重傳包大 因此肯定會被丟棄
isn有可能是重新計(jì)算 也有可能是重timewait狀態(tài)中獲取一個(gè)初始值在加上時(shí)間因子霎匈。所以不存在定時(shí)器 但是這個(gè)時(shí)間因子會使得值每4us加1
msl是報(bào)文生存周期 我們一個(gè)請求到響應(yīng)最多2msl 超過2msl時(shí)候會被網(wǎng)絡(luò)(不是比較時(shí)間戳)丟棄無法被接受 戴差, 有可能是tcp層面計(jì)算時(shí)間超過msl就直接丟棄 這個(gè)丟棄是依靠ip層ttl 但是ttl如何和msl有關(guān)系是個(gè)問題
普通的回繞依靠窗口大小,tcp可以區(qū)分新老鏈接數(shù)據(jù)包或者新舊數(shù)據(jù)包
但是對于回繞幅度超過2的31次方則只能采取時(shí)間戳比較
這種情況主要就是包重傳铛嘱,如果網(wǎng)絡(luò)傳輸很快導(dǎo)致序列號使用很快暖释,或者說某些極端情況導(dǎo)致ttl比msl長引起的問題
paws只要兩邊都打開timestamp就可以