TCP中RTT的測(cè)量和RTO的計(jì)算

RTO(Retransmission TimeOut)即重傳超時(shí)時(shí)間

TCP超時(shí)與重傳中一個(gè)最重要的部分是對(duì)一個(gè)給定連接的往返時(shí)間(RTT)的測(cè)量吕漂。由于網(wǎng)絡(luò)流量的變化既绩,這個(gè)時(shí)間會(huì)相應(yīng)地發(fā)生改變邻遏,TCP需要跟蹤這些變化并動(dòng)態(tài)調(diào)整超時(shí)時(shí)間RTO。

RFC2988中是這樣描述RTO的:

“The Transmission Control Protocol(TCP) uses a retransmission timer to ensure data

delivery in the absence of ?any feedback from the remote data receiver.The duration of

this timer is referred to as RTO(retransmission timeout).”

RTT(Round Trip Time)由三部分組成:鏈路的傳播時(shí)間(propagation delay),末端系統(tǒng)的處理時(shí)間萝衩,路由器緩存中的排隊(duì)和處理時(shí)間(queuing delay)劳曹。

其中,前兩個(gè)部分的值對(duì)于一個(gè)TCP連接相對(duì)固定蔬螟,路由器緩存中的排隊(duì)和處理時(shí)間會(huì)隨著整個(gè)網(wǎng)絡(luò)擁塞程度的變化而變化此迅。所以RTT的變化在一定程度上反應(yīng)了網(wǎng)絡(luò)的擁塞程度。

平均偏差

平均偏差(mean deviation),簡(jiǎn)寫為mdev旧巾。

It is the mean of the distance between each value and the mean.It gives us an idea of how spread out from the center the set of values is.

Here's the formula.


通過計(jì)算平均偏差耸序,可以知道一組數(shù)據(jù)的波動(dòng)情況。

在這里鲁猩,平均偏差可以用來衡量RTT的抖動(dòng)情況坎怪。

RTT測(cè)量原理

RTT的測(cè)量可以采用兩種方法

(1)TCP Timestamp選項(xiàng)

TCP時(shí)間戳選項(xiàng)可以用來精確的測(cè)量RTT.

RTT=當(dāng)前時(shí)間- 數(shù)據(jù)包中Timestamp選項(xiàng)的回顯時(shí)間

這個(gè)回顯時(shí)間是該數(shù)據(jù)包發(fā)出去的時(shí)間,知道了數(shù)據(jù)包的接收時(shí)間(當(dāng)前時(shí)間)和發(fā)送時(shí)間(回顯時(shí)間),就可以輕松的得到RTT的一個(gè)測(cè)量值廓握。

(2)重傳隊(duì)列中數(shù)據(jù)包的TCP控制塊

在TCP重傳隊(duì)列中保存著發(fā)送而未被確認(rèn)的數(shù)據(jù)包搅窿,數(shù)據(jù)包skb中的TCP控制塊包含著一個(gè)變量,tcp_skb_cb->when隙券,記錄了該數(shù)據(jù)包的第一次發(fā)送時(shí)間男应。

RTT=當(dāng)前時(shí)間 - when

有人可能會(huì)問:既然不用TCP Timestamp選項(xiàng)就能測(cè)量出RTT,為啥還要多此一舉?

這是因?yàn)榉椒ㄒ槐确椒ǘ墓δ芨訌?qiáng)大娱仔,它們是有區(qū)別的沐飘。

“TCP must use Karn's algorithm for taking RTT samples.That is,RTT samples MUST NOT be made using segments that were retransmitted(and thus for which it is ambiguious whether the reply was for the first instance of the packet or a later instance).The only case when TCP can safely take RTT samples from retransmitted segments is when the TCP timestamp option is employed, since the timestamp option removes the ambiguity regarding which instance of the data segment triggered the acknowledgement.”

對(duì)于重傳的數(shù)據(jù)包的響應(yīng),方法1可以用它來采集一個(gè)新的RTT測(cè)量樣本牲迫,而方法二則不能耐朴。因?yàn)門CP Timestamp選項(xiàng)可以區(qū)分這個(gè)響應(yīng)是原始數(shù)據(jù)包還是重傳數(shù)據(jù)包觸發(fā)的,從而計(jì)算出準(zhǔn)確的RTT值盹憎。

RTT測(cè)量實(shí)現(xiàn)

發(fā)送方每接收到一個(gè)ACK筛峭,都會(huì)調(diào)用tcp_ack()來處理。

tcp_ack()中會(huì)調(diào)用tcp_clean_rtx_queue()來刪除重傳隊(duì)列中已經(jīng)被確認(rèn)的數(shù)據(jù)段陪每。

在tcp_clean_rtx_queue()中:

如果ACK確認(rèn)了重傳的數(shù)據(jù)包影晓,則seq_rtt=-1;

否則镰吵,seq_rtt = now - scb->when;

然后調(diào)用tcp_ack_update_rtt(sk,flag,seq_rtt)來更新RTT和RTO.

[java]

static inline void tcp_ack_update_rtt(struct sock *sk,const in flag,const s32 seq_rtt)

{

? ? ? ?const struct tcp_sock *tp = tcp_sk(sk);

/*Note that peer MAY send zero echo.In this case it is ignored.(rfc1323)*/

/*如果有啟用TCP Timestamp選項(xiàng)俯艰,且接收方的回顯不為0*/

if(tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr)

tcp_ack_saw_tstamp(sk,flag);/*方法一*/

else if(seq_rtt >= 0) ?/*不能是重傳數(shù)據(jù)包的ACK */

tcp_ack_no_tstamp(sk,seq_rtt,flag);/*方法二*/

}

方法一:tcp_ack_saw_tstamp()

[java]

/* Read draft-ietf-tcplw-high-performance before mucking with this code.

*?(Supersedes?RFC1323)

*/

staticvoidtcp_ack_saw_tstamp(struct?sock?*sk,intflag)

{

/*?RTTM?Rule?:?A?TSecr?value?received?in?a?segment?is?used?to?update?the

*?averaged?RTT?measurement?only?if?the?segment?acknowledges?some?new

*?data,?i.e.,?only?if?it?advances?the?left?edge?of?the?send?window.

*

*?See?draft-ietf-tcplw-high-performance-00,?section?3.3.

*?1998/04/10?Andrey?V.?Savochkin?saw@msu.ru

*

*?Changed?:?reset?backoff?as?soon?as?we?see?the?first?valid?sample.

*?If?we?do?not,?we?get?strongly?overestimated?rto.?With?timestamps

*?samples?are?accepted?even?from?very?old?segments:?f.e.,?when

*?rtt?=?1?increases?to?8,?we?retransmit?5?times?and?after?8?seconds

*?delayed?answer?arrives?rto?becomes?120?seconds!?If?at?least?one

*?of?segments?in?window?is?lost...?Volia.

*?——ANK(010210)

*/

struct?tcp_sock?*tp?=?tcp_sk(sk);

/*?RTT采樣值:now?-?rcv_tsecr?*/

tcp_valid_rtt_meas(sk,?tcp_time_stamp?-?tp->rx_opt.rcv_tsecr);

}

方法二:tcp_ack_no_tstamp()

[java]

staticvoidtcp_ack_no_tstamp(struct sock *sk, u32 seq_rtt,intflag)

{

/*?We?don't?have?a?timestsamp.?Can?only?use?packets?that?are?not

*?retransmitted?to?determine?rtt?estimates.?Also,?we?must?not?reset

*?the?backoff?for?rto?until?we?get?a?non-retransmitted?packet.?This

*?allows?us?to?deal?with?a?situation?where?the?network?delay?has

*?increased?suddenly.?I.e.?Karn's?algorithm.?(SIGCOMM?'87,?p5.)

*/

if(flag?&?FLAG_RETRANS_DATA_ACKED)

return;/*?如果ACK確認(rèn)的是重傳的數(shù)據(jù)包捡遍,則不進(jìn)行RTT采樣*/

/*?RTT采樣值:seq_rtt锌订,這個(gè)值是在tcp_clean_rtx_queue()中計(jì)算得到的竹握。*/

tcp_valid_rtt_meas(sk,?seq_rtt);

}

OK,到這邊RTT的測(cè)量已經(jīng)結(jié)束了,接下來就是RTO值得計(jì)算

RTO計(jì)算原理

涉及到的變量

[java]

struct tcp_sock {

...

/*?RTT?measurement?*/

u32?srtt;/*?smoothed?round?trip?time?<<?3?*/

u32?mdev;/*?medium?deviation?*/

u32?mdev_max;/*?maximal?mdev?for?the?last?rtt?period?*/

u32?rttvar/*?smoothed?mdev_max?*/

u32?rtt_seq;/*?sequence?number?to?update?rttvar?*/

...

}

srtt為經(jīng)過平滑后的RTT值辆飘,它代表著當(dāng)前的RTT值啦辐,每收到一個(gè)ACK更新一次。

為了避免浮點(diǎn)運(yùn)算蜈项,它是實(shí)際RTT值的8倍芹关。

mdev為RTT的平均偏差,用來衡量RTT的抖動(dòng)紧卒,每收到一個(gè)ACK更新一次侥衬。

mdev_max為上一個(gè)RTT內(nèi)的最大mdev,代表上個(gè)RTT內(nèi)時(shí)延的波動(dòng)情況跑芳,有效期為一個(gè)RTT.

rttvar為mdev_max的平滑值轴总,可升可降,代表著連接的抖動(dòng)情況博个,在連接斷開前都有效怀樟。

“To compute the current RTO,a TCP sender maintains two state variables,SRTT(smoothed round-trip time) and RTTVAR(round-trip time variation).”

實(shí)際上盆佣,RTO = srtt>>3+rttvar.

rtt表示新的RTT測(cè)量值往堡。

old_srtt表示srtt更新前的srtt>>3,即舊的srtt值共耍。

new_srtt表示srtt更新后的srtt>>3,即新的srtt值虑灰。

old_mdev表示舊的mdev。

new_mdev表示更新后的mdev痹兜。

(1)獲得第一個(gè)RTT測(cè)量值

srtt = rtt<<3;

mdev=rtt<<1;

mdev_max = rttvar = max(mdev,rto_min);

所以穆咐,獲得第一個(gè)RTT測(cè)量值后的RTO = rtt+rttvar,如果mdev=2*rtt>rto_min,

那么RTO = 3*rtt;否則 RTO=rtt+rto_min.

(2)獲得第一個(gè)RTT測(cè)量值

srtt = rtt<<3;

mdev = rtt<<1;

mdev_max=rttvar=max(mdev,rto_min);

所以獲得第一個(gè)RTT測(cè)量值后的RTO=rtt+rttvar,如果mdev = 2*rtt>rto_min,

那么RTO=3*rtt;否則佃蚜,RTO=rtt+rto_min庸娱。

(2)獲得第n個(gè)RTT測(cè)量值(n>=2)

srtt的更新:new_srtt = 7/8 old_srtt+1/8 rtt

mdev的更新:

err=rtt-old_srtt

當(dāng)RTT變小時(shí),即err<0時(shí)

1)如果|err|>1/4 old_mdev谐算,則new_mdev = 31/32 old_mdev + 1/8|err|

此時(shí):old_mdev<new_mdev<3/4 old_mdev + |err|

new_mdev有稍微變大熟尉,但是增大得不多。由于RTT是變小洲脂,所以RTO也要變小斤儿,如果

new_mdev增大很多(比如:new_mdev = 3/4 old_mdev+|err|),就會(huì)導(dǎo)致RTO變大剧包,不符合我們的預(yù)期

“This is similar to one of Eifel findings.Eifel blocks mdev updates when rtt decreases.

This solution is a bit different:we use finer gain for mdev in this case(alpha *beta).

Like Eifel it also prevents growth of rto,but also it limits too fast rto decreases,happening in pure Eifel.”

2)如果|err|<=1/4 old_mdev,則new_mdev=3/4 old_mdev + |err|

此時(shí):new_mdev < old_mdev

new_mdev變小,會(huì)導(dǎo)致RTO變小往果,符合我們的預(yù)期疆液。

當(dāng)RTT變大時(shí),即err>0時(shí)

new_mdev = 3/4 old_mdev + |err|

此時(shí):new_mdev > old_mdev

new_mdev變大陕贮,會(huì)導(dǎo)致RTO變小堕油,這也符合我們的預(yù)期。

mdev_max和rttvar的更新

在每個(gè)RTT開始時(shí)肮之,mdev_max = rto_min

如果在此RTO內(nèi)掉缺,有更大的mdev,則更新mdev_max戈擒。

如果mdev_max ?> rttvar,則rttvar = mdev_max;

否則眶明,本RTT結(jié)束后,rttvar -=(rttvar - mdev_max)>>2筐高。

這樣一來搜囱,就可以通過mdev_max來調(diào)節(jié)rttvar,間接的調(diào)節(jié)RTO。

RTO計(jì)算實(shí)現(xiàn)

不管是方法一還是方法二柑土,最終都調(diào)用tcp_valid_rtt_means()來更新RTT和RTO.

[java]

/* seq_rtt為此次得到的RTT測(cè)量值蜀肘。*/

voidtcp_valid_rtt_meas(struct?sock?*sk,?u32?seq_rtt)

{

tcp_rtt_estimator(sk,?seq_rtt);/*?更新相關(guān)值*/

tcp_set_rto(sk);/*設(shè)置新的RTO*/

inet_csk(sk)->icsk_backoff?=0;/*?清零退避指數(shù)*/

}

RTO = srtt>>8+rttvar。而srtt和rttvar的更新都是在tcp_rtt_estimator()來進(jìn)行冰单。

[java]

/* Called to compute a smoothed rtt estimate. The data fed to this

*?routine?either?comes?from?timestamps,?or?from?segments?that?were

*?known?_not_?to?have?been?retransmitted?[see?Karn/Partridge?Proceedings

*?SIGCOMM?87].?The?algorithm?is?from?the?SIGCOMM?88?piece?by?Van

*?Jacobson.

*?NOTE?:?the?next?three?routines?used?to?be?one?big?routine.

*?To?save?cycles?in?the?RFC?1323?implementation?it?was?better?to?break?it

*?up?into?three?procedures.?——erics

*/

staticvoidtcp_rtt_estimator?(struct?sock?*sk,const__u32?mrtt)

{

struct?tcp_sock?*tp?=?tcp_sk(sk);

longm?=?mrtt;/*此為得到的新的RTT測(cè)量值*/

/*?The?following?amusing?code?comes?from?Jacobson's?article?in

*?SIGCOMM?'88.?Note?that?rtt?and?mdev?are?scaled?versions?of?rtt?and

*?mean?deviation.?This?is?designed?to?be?as?fast?as?possible

*?m?stands?for?"measurement".

*

*?On?a?1990?paper?the?rto?value?is?changed?to?:

*?RTO?=?rtt?+?4?*?mdev

*

*?Funny.?This?algorithm?seems?to?be?very?broken.

*?These?formulae?increase?RTO,?when?it?should?be?decreased,?increase

*?too?slowly,?when?it?should?be?increased?quickly,?decrease?too?quickly

*?etc.?I?guess?in?BSD?RTO?takes?ONE?value,?so?that?it?is?absolutely?does

*?not?matter?how?to?calculate?it.?Seems,?it?was?trap?that?VJ?failed?to

*?avoid.?8)

*/

if(m?==0)

m?=1;/*?RTT的采樣值不能為0?*/

/*?不是得到第一個(gè)RTT采樣*/

if(tp->srtt?!=0)?{

m?-=?(tp->srtt?>>3);/*?m?is?now?error?in?rtt?est?*/

tp->srtt?+=?m;/*?rtt?=?7/8?rtt?+?1/8?new?幌缝,更新srtt*/

if(m?<0)?{/*RTT變小*/

m?=?-m;/*?m?is?now?abs(error)?*/

m?-=?(tp->mdev?>>2);/*?similar?update?on?mdev?*/

/*?This?is?similar?to?one?of?Eifel?findings.

*?Eifel?blocks?mdev?updates?when?rtt?decreases.

*?This?solution?is?a?bit?different?:?we?use?finer?gain

*?mdev?in?this?case?(alpha?*?beta).

*?Like?Eifel?it?also?prevents?growth?of?rto,?but?also?it

*?limits?too?fast?rto?decreases,?happening?in?pure?Eifel.

*/

if(m?>0)/*?|err|?>?1/4?mdev?*/

m?>>=3;

}else{/*?RTT變大?*/

m?-=?(tp->mdev?>>2);/*?similar?update?on?mdev?*/

}

tp->mdev?+=?m;/*?mdev?=?3/4?mdev?+?1/4?new,更新mdev?*/

/*?更新mdev_max和rttvar?*/

if(tp->mdev?>?tp->mdev_max)?{

tp->mdev_max?=?tp->mdev;

if(tp->mdev_max?>?tp->rttvar?)

tp->rttvar?=?tp->mdev_max;

}

/* 過了一個(gè)RTT了诫欠,更新mdev_max和rttvar */

if(after(tp->snd_una, tp->rtt_seq)) {

if(tp->mdev_max < tp->rttvar)/*減小rttvar */

tp->rttvar -= (tp->rttvar - tp->mdev_max) >>2;

tp->rtt_seq = tp->snd_nxt;

tp->mdev_max = tcp_rto_min(sk);/*重置mdev_max */

}

if(after(tp->snd_una, tp->rtt_seq)) {

if(tp->mdev_max < tp->rttvar)/*減小rttvar */

tp->rttvar -= (tp->rttvar - tp->mdev_max) >>2;

tp->rtt_seq = tp->snd_nxt;

tp->mdev_max = tcp_rto_min(sk);/*重置mdev_max */

}

}else{

/* 獲得第一個(gè)RTT采樣*/

/* no previous measure. */

tp->srtt = m <<3;/* take the measured time to be rtt */

tp->mdev = m <<1;/* make sure rto = 3 * rtt */

tp->mdev_max = tp->rttvar = max(tp->mdev, tcp_rto_min(sk));

tp->rtt_seq = tp->snd_nxt;/*設(shè)置更新mdev_max的時(shí)間*/

}

}

rto_min的取值如下:

[java]

/*?最大的RTO為120s涵卵,指數(shù)退避時(shí)不能超過這個(gè)值?*/

#define?TCP_RTO_MAX?((unsigned)?(120*HZ))

/*?最小的RTO為200ms,rttvar不能低于這個(gè)值?*/

#define?TCP_RTO_MIN?((unsigned)?(HZ?/5))

/*?還沒有計(jì)算出RTO值前的RTO初始值荒叼,為1s?*/

#define?TCP_TIMEOUT_INIT?((unsigned)?(1*?HZ))

/*?Compute?the?actual?rto_min?value?*/

staticinline?u32?tcp_rto_min?(struct?sock?*sk)

{

conststruct?dst_entry?*dst?=?__sk_dst_get(sk);

u32?rto_min?=?TCP_RTO_MIN;

/*如果路由緩存中存在RTO_MIN轿偎,則取其為最小RTO*/

if(dst?&&?dst_metric_locked(dst,?RTAX_RTO_MIN))

rto_min?=?dst_metric_rtt(dst,?RTAX_RTO_MIN));

returnrto_min;

}

RTO的設(shè)置

[java]

/* Calculate rto without backoff. This is the second half of Van Jacobson's

*?routine?referred?to?above.

*/

staticinlinevoidtcp_set_rto(struct?sock?*sk)

{

conststruct?tcp_sock?*tp?=?tcp_sk(sk);

inet_csk(sk)->icsk_rto?=?__tcp_set_rto(tp);

tcp_bound_rto(sk);

}

staticinline?u32?__tcp_set_rto(conststruct?tcp_sock?*tp)

{

return(tp->srtt?>>3)?+?tp->rttvar;

}

staticinlinevoidtcp_bound_rto(conststruct?sock?*sk)

{

if(inet_csk(sk)->icsk_rto?>?TCP_RTO_MAX)

inet_csk(sk)->icsk_rto?=?TCP_RTO_MAX;

}

函數(shù)調(diào)用

以上涉及到的函數(shù)調(diào)用關(guān)系如下:



總結(jié)

早期的RTT的測(cè)量是采用粗粒度的定時(shí)器(Coarse grained timer),這會(huì)有比較大的誤差。

現(xiàn)在由于TCP Timestamp選項(xiàng)的使用被廓,能夠更精確的測(cè)量RTT,從而計(jì)算出更加準(zhǔn)確的RTO

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坏晦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嫁乘,更是在濱河造成了極大的恐慌昆婿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜓斧,死亡現(xiàn)場(chǎng)離奇詭異仓蛆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挎春,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門看疙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豆拨,“玉大人,你說我怎么就攤上這事能庆∈┖蹋” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵搁胆,是天一觀的道長(zhǎng)弥搞。 經(jīng)常有香客問我,道長(zhǎng)丰涉,這世上最難降的妖魔是什么拓巧? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任斯碌,我火速辦了婚禮一死,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘傻唾。我一直安慰自己投慈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布冠骄。 她就那樣靜靜地躺著伪煤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凛辣。 梳的紋絲不亂的頭發(fā)上抱既,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音扁誓,去河邊找鬼防泵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蝗敢,可吹牛的內(nèi)容都是我干的捷泞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寿谴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼锁右!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起讶泰,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咏瑟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后痪署,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體码泞,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年惠桃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浦夷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辖试。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖劈狐,靈堂內(nèi)的尸體忽然破棺而出罐孝,到底是詐尸還是另有隱情,我是刑警寧澤肥缔,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布莲兢,位于F島的核電站,受9級(jí)特大地震影響续膳,放射性物質(zhì)發(fā)生泄漏改艇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一坟岔、第九天 我趴在偏房一處隱蔽的房頂上張望谒兄。 院中可真熱鬧,春花似錦社付、人聲如沸承疲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)燕鸽。三九已至,卻和暖如春啼辣,著一層夾襖步出監(jiān)牢的瞬間啊研,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工鸥拧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留党远,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓住涉,卻偏偏與公主長(zhǎng)得像麸锉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舆声,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 套接字選項(xiàng)SO_RESUEADDR 即使端口處于2MSL狀態(tài)花沉,使用該選項(xiàng),仍然能夠在該端口建立連接媳握。服務(wù)器常會(huì)設(shè)置...
    Myth52125閱讀 1,408評(píng)論 0 0
  • 21.1 引言 TCP提供可靠的運(yùn)輸層碱屁。它使用的方法之一就是確認(rèn)從另一端收到的數(shù)據(jù)。但數(shù)據(jù)和確認(rèn)都有可能會(huì)丟失蛾找。T...
    張芳濤閱讀 3,001評(píng)論 0 8
  • 24.1 引言 TCP已經(jīng)在從1200 b/s的撥號(hào)SLIP鏈路到以太數(shù)據(jù)鏈路上運(yùn)行了許多年娩脾。在80年代和90年代...
    張芳濤閱讀 1,486評(píng)論 0 3
  • 個(gè)人認(rèn)為,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記打毛,這雖然只是...
    貳零壹柒_fc10閱讀 5,054評(píng)論 0 8
  • 1.這篇文章不是本人原創(chuàng)的柿赊,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的俩功,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,063評(píng)論 6 174