本帖最后由 lmarsin 于 2010-05-07 15:21 編輯
struct {...} icsk_ack 延時(shí)確認(rèn)控制數(shù)據(jù)塊,以下是對各字段的簡要描述。 __u8 pending 標(biāo)識當(dāng)前需發(fā)送確認(rèn)的緊急程度和狀態(tài)。在數(shù)據(jù)從內(nèi)核空間復(fù)制到用戶空間時(shí)會檢測該狀態(tài),如果需要?jiǎng)t立即發(fā)送確認(rèn);而在計(jì)算rcv_mss時(shí),會根據(jù)情況調(diào)整此狀態(tài)。由于pending是按位存儲的,因此多個(gè)狀態(tài)可以同時(shí)存在。
pending
| 描述
| ICSK_ACK_SCHED
| 有ACK需要發(fā)送,是立即發(fā)送還是延時(shí)發(fā)送,還需要看其他標(biāo)志,也是能否發(fā)送確認(rèn)的前提。在接收到有負(fù)荷的TCP段后,會設(shè)置該標(biāo)志。 | ICSK_ACK_TIMER | 延時(shí)發(fā)送ACK定時(shí)器已經(jīng)啟動(dòng)。 | ICSK_ACK_PUSHED | 只要有ACK需要發(fā)送,并且pingpong為0時(shí),ACK可以立即發(fā)送。 | ICSK_ACK_PUSHED2 | 只要有ACK需要發(fā)送,都可以立即發(fā)送,不管是否在快速發(fā)送模式中。 |
__u8 quick 標(biāo)識在快速發(fā)送確認(rèn)模式中,可以快速發(fā)送ACK段的數(shù)量。與pingpong一同作為判斷是否在快速發(fā)送確認(rèn)模式下的條件,如果要延時(shí)發(fā)送確認(rèn),則必須要在延時(shí)發(fā)送確認(rèn)模式下。 __u8 pingpong 標(biāo)識啟用或禁用快速確認(rèn)模式。通過TCP_QUICKACK選項(xiàng)可以設(shè)置其值。
pingpong | 描述 | 0
| 不延時(shí)ACK段的發(fā)送,而是進(jìn)行快速發(fā)送。 | 1 | 將會延時(shí)發(fā)送ACK。 |
在快速確認(rèn)模式下,會立即發(fā)送ACK。整個(gè)TCP處理過程中,如果需要還會進(jìn)入到正常模式運(yùn)行,也就是說,這個(gè)標(biāo)志的設(shè)置不是永久性的,而只是在當(dāng)時(shí)啟用/禁用快速確認(rèn)模式,在這之后,根據(jù)如延時(shí)確認(rèn)超時(shí)、數(shù)據(jù)傳輸因素等,有可能會再次進(jìn)入或離開快速確認(rèn)模式。 __u8 blocked 軟中斷和用戶進(jìn)程是不能同時(shí)占有鎖定套接口的,因此如果套接口已被用戶進(jìn)程鎖定,而此時(shí)延時(shí)ACK定時(shí)器被觸發(fā),在邏輯上說此時(shí)應(yīng)該發(fā)送ACK,但由于套接口被用戶進(jìn)程鎖定了不能訪問,因此只能置blocked標(biāo)志為1,表示“套接口被用戶進(jìn)程鎖定了,現(xiàn)不能發(fā)送ACK,如果有機(jī)會立即發(fā)送ACK”,這些機(jī)會包括接收到數(shù)據(jù)之后和將數(shù)據(jù)復(fù)制到用戶空間之后。 __u32 ato 用來計(jì)算延時(shí)確認(rèn)的估值,在接收到TCP段時(shí)會根據(jù)本次與上次接收的時(shí)間間隔來調(diào)整該值,而在設(shè)置延時(shí)確認(rèn)定時(shí)器時(shí)也會根據(jù)條件調(diào)整該值。 unsignedlong timeout 當(dāng)前的延時(shí)確認(rèn)時(shí)間,超時(shí)后會發(fā)送ACK。 __u32 lrcvtime 標(biāo)識最近一次接收到數(shù)據(jù)包的時(shí)間。 __u16 last_seg_size 最后一個(gè)接收到的段的長度,用來計(jì)算rcv_mss。 __u16 rcv_mss 由最近接收到段計(jì)算出的MSS,主要用來確定是否執(zhí)行延時(shí)確認(rèn)。 |