在线亚洲黄色-在线亚洲观看-在线亚洲电影-在线亚洲成人-岛国大片在线观看免费版-岛国大片在线播放高清

linuxTCP數據包重傳過程小結

導讀代碼如下: 。/*ThisretransmitsoneSKB. ;Policydecisionsandretransmitqueue。 ;*stateupdatesaredonebythecaller. ;Returnsnon-zeroifan。 ;*erroroccurredwhichpreventedthesend。 ;*/;inttcp_retransmit_skb(structsock*sk,structsk_buff*skb)。{;structtcp_sock*tp=tcp_sk(sk)。structinet_connection_sock*icsk=inet_csk(sk)。unsignedintcur_mss。interr。

于TCP/IP協議棧的TCP協議的重傳功能是由在linux內核源碼(net/ipv4/tcp_output.c)中的函數tcp_retransmit_skb()實現的代碼如下:?/*ThisretransmitsoneSKB.?Policydecisionsandretransmitqueue?*stateupdatesaredonebythecaller.?Returnsnon-zeroifan?*erroroccurredwhichpreventedthesend.?*/inttcp_retransmit_skb(structsock*sk,structsk_buff*skb){structtcp_sock*tp=tcp_sk(sk);structinet_connection_sock*icsk=inet_csk(sk);unsignedintcur_mss;interr;?/*InconslusiveMTUprobe*/if(icsk->icsk_mtup.probe_size){icsk->icsk_mtup.probe_size=0;}?/*Donotsentmorethanwequeued.1/4isreservedforpossible*copyingoverhead:fragmentation,tunneling,manglingetc.*///說明在發送緩存區中消耗了許多內存去做其他的工作(比如分片等,只有1/4的緩存才是保留給這些工作的),暫時不能重傳if(atomic_read(&sk->sk_wmem_alloc)>??min(sk->sk_wmem_queued+(sk->sk_wmem_queued>>2),sk->sk_sndbuf))return-EAGAIN;//檢測重傳的段,接收方是否已經收到其部分或者全部,如果收到則說明有bug,否者就調整TCP段的負荷,即刪除SKB緩存區//前面部分已經接收到的數據if(before(TCP_SKB_CB(skb)->seq,tp->snd_una)){if(before(TCP_SKB_CB(skb)->end_seq,tp->snd_una))BUG();if(tcp_trim_head(sk,skb,tp->snd_una-TCP_SKB_CB(skb)->seq))return-ENOMEM;}//根據目的地址等條件獲取路由,如果獲取路由失敗就不能發送if(inet_csk(sk)->icsk_af_ops->rebuild_header(sk))return-ehostunreach;/*Routingfailureorsimilar.*/?cur_mss=tcp_current_mss(sk);?/*Ifreceiverhasshrunkhiswindow,andskbisoutof*newwindow,donotretransmitit.Theexceptionisthe*case,whenwindowisshrunktozero.Inthiscase*ourretransmitservesasazerowindowprobe.*///如果接收方已經減小了窗口,并且帶重傳的SKB已經不在新的窗口內,則不能重傳該SKB,//有一種情況例外,就是接收方的接受窗口減少為0,在這種情況下會發送0窗口探測段if(!before(TCP_SKB_CB(skb)->seq,tcp_wnd_end(tp))&&??TCP_SKB_CB(skb)->seq!=tp->snd_una)return-EAGAIN;?if(skb->len>cur_mss){//如果當前的SKB長度大于MSS,則要進行分段處理if(tcp_fragment(sk,skb,cur_mss,cur_mss))return-ENOMEM;/*We'lltryagainlater.*/}else{intoldpcount=tcp_skb_pcount(skb);?if(unlikely(oldpcount>1)){tcp_init_tso_segs(sk,skb,cur_mss);tcp_adjust_pcount(sk,skb,oldpcount-tcp_skb_pcount(skb));}}?tcp_retrans_try_collapse(sk,skb,cur_mss);?/*SomeSolarisstacksoveroptimizeandignoretheFINona*retransmitwhenolddataisattached.?Sostripitoff*sinceitischeaptodosoandsavesbytesonthenetwork.*///有以下Solaris系統的協議棧有時候會忽略重傳SKB上帶有的FIN標志的payload,將payload全部剝離掉,節省網絡流量if(skb->len>0&&??(TCP_SKB_CB(skb)->flags&TCPHDR_FIN)&&??tp->snd_una==(TCP_SKB_CB(skb)->end_seq-1)){if(!pskb_trim(skb,0)){/*Reuse,eventhoughitdoessomeunnecessarywork*/tcp_init_nondata_skb(skb,TCP_SKB_CB(skb)->end_seq-1,??TCP_SKB_CB(skb)->flags);skb->ip_summed=CHECKSUM_NONE;}}?/*Makeacopy,ifthefirsttransmissionSKBclonewemade*isstillinsomebody'shands,elsemakeaclone.*/TCP_SKB_CB(skb)->when=tcp_time_stamp;?err=tcp_transmit_skb(sk,skb,1,GFP_ATOMIC);//發送SKB?if(err==0){/*UpdateglobalTCPstatistics.*/TCP_INC_STATS(sock_net(sk),TCP_MIB_RETRANSSEGS);?tp->total_retrans++;?#ifFASTRETRANS_DEBUG>0if(TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_RETRANS){if(net_ratelimit())printk(KERN_DEBUG"retrans_outleaked.");}#endifif(!tp->retrans_out)tp->lost_retrans_low=tp->snd_nxt;TCP_SKB_CB(skb)->sacked|=TCPCB_RETRANS;tp->retrans_out+=tcp_skb_pcount(skb);?/*Savestampofthefirstretransmit.*/if(!tp->retrans_stamp)tp->retrans_stamp=TCP_SKB_CB(skb)->when;?tp->undo_retrans+=tcp_skb_pcount(skb);?/*snd_nxtisstoredtodetectlossofretransmittedsegment,*seetcp_input.ctcp_sacktag_write_queue().*/TCP_SKB_CB(skb)->ack_seq=tp->snd_nxt;}returnerr;}我們知道,TCP的發送是有一個SKB隊列如圖,這樣維持一個發送隊列,如果收到發送了SKB的ACK,就將對應的SKB從隊列中刪除掉,在函數tcp_retransmit_skb中我們可以看到,接受方游有可能只是收到了部分SKB的數據,那么就將收到的SKB的數據刪除掉,這樣可以節省緩存空間這里注意的到函數tcp_retransmit_skb()最終的是調用函數tcp_transmit_skb(sk,skb,1,GFP_ATOMIC);將SKB發送出去,而構造TCP的頭部信息在函數tcp_transmit_skb()中,下面是函數tcp_transmit_skb()構造TCP頭部的片段所以也就是說在發送隊列中的SKB是沒有頭部的,這也是方便了選擇重傳等功能/*BuildTCPheaderandchecksumit.*/th=tcp_hdr(skb);th->source=inet->inet_sport;th->dest=inet->inet_dport;th->seq=htonl(tcb->seq);th->ack_seq=htonl(tp->rcv_nxt);*(((__be16*)th)+6)=htons(((tcp_header_size>>2)<<12)|tcb->flags);?本文來自系統大全為您提供如需轉載請注明!推薦win10下載

為你推薦
資訊專欄
熱門視頻
相關推薦
linux當前網絡連接狀態 如圖所示2此時點擊添加帳戶按鈕3接下來 雷蛇巴塞利斯蛇安裝什么驅動雷蛇巴塞利斯蛇驅動下載安裝教程 win11電腦如何重啟資源管理器win11重啟資源管理器步驟教學 芝士雪豹梗怎么來的芝士雪豹梗含義和出處介紹 Linutsshsftp服務重啟 四川事業單位《綜合知識》 女人和別的男生打鬧,叫我幫她忙啥意思? 女士鞋子35碼和36碼分別是多少厘米的啊? 高中畢業去讀技校是什么文憑 武漢哪有很漂亮的雨鞋啊? 在平安夜,當我送禮物給女朋友的時候,我應該對她說些什么? 結婚25年什么婚有什么講究嗎 求網名 表示特別悲傷 表示我死了 的網名? 小說中男主摔下電梯頭磕到電腦得到的異能是能透視能在古董中吸收靈氣有誰知道 宗申牌zS150zH一16G是國幾的車? 這兩天牙齒痛,去看醫生說是牙周炎,痛的那顆牙齒感覺有些松動,請問治療要多少錢??! 哪位可以告訴我金鐘民在韓流現在人氣怎樣?拜托各位大神 濟南市和青島市公務員工資是多少? 什么經典情歌超老又我聽過的. Linux最大打開文件描述符數 VIM中文參考手冊 Linux下怎么樣查看高CPU占用率線程 Linux權限管理 XP系統連接紅外線的具體步驟 XP系統無法響應怎么辦 Windows10系統原生支持mkv格式視頻播放 為什么windows10慢了很多呢 Windows8更新提示8024200D錯誤解決辦法 linuxtr的命令辦法2 鎖定計算機的快捷鍵WinKeyL失效的解決措施 Linux下如何查看高CPU占用率線程 windows查看進程 Linux系統中添加字體的方法 XP系統如何添加字體 Linux下各個文件目錄及其作用 RedHat之系統基本配置 如何調整分別率讓windowsxp顯示更細膩 Windows10系統下如何禁止u盤拷貝文件怎么設置Wi win8配置windows更新失敗正在還原更改處理方法
Top 主站蜘蛛池模板: 久久精品无码一区二区日韩av | 亚洲国产福利 | 精品久久久久久国产牛牛app | 欧美中文在线 | 国产不卡一区二区视频免费 | 国产网站视频 | 午夜精品视频 | 伊人精品久久久大香线蕉99 | 成人亚洲国产精品久久 | 欧美成人免费高清二区三区 | 看全色黄大色大片免费久久 | 欧美精品色精品一区二区三区 | 日韩欧美伦理 | 久久免费国产精品一区二区 | 成人看免费一级毛片 | 日韩影片在线观看 | 图片专区亚洲 欧美 另类 | 欧美亚洲综合另类在线观看 | 欧美一区二区三区在线播放 | 国产资源网站 | 成人毛片一区二区三区 | 久久精品99久久香蕉国产色戒 | 亚洲精品视频在线观看免费 | 一区二区三区欧美日韩 | 国产精选免费视频 | 国产一区二区三区欧美 | 日韩在线观看不卡 | 久久久久久久一精品 | 看全色黄大色黄女片爽毛片 | 亚洲综合一区二区精品久久 | 激性欧美激情在线aa | 中日韩在线 | 欧美区在线 | 国产精品伦一区二区三级视频 | 亚洲精品视频免费在线观看 | 亚洲一区二区三区高清 | 成人国产一区二区三区精品 | 九九久久香港经典三级精品 | 欧美日韩不卡视频一区二区三区 | 91亚洲 欧美 国产 制服 动漫 | 日韩另类 |