久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: TCP發送隊列原理 [打印本頁]

作者: jialinx    時間: 2015-9-13 20:28
標題: TCP發送隊列原理
TCP發送數據的時候并不是直接送出數據的,而是考慮了后續的數據一起發送所以,采用的是緩存隊列機制。

一、API參數
1、
pcb指針
控制塊記錄這個連接的幾乎所有的例如端口、IP地址、發送隊列、接收窗口、序號等等自然不用細說。作為一個全局結構記錄著你開的TCP所有的信息。所以只要找到他就可以知道和當前連接的所有有關結構的值。因此在程序調試過程中可以利用他來鎖定相關的參數值等。所以這個指針就是指向了當前建立的連接。
2、 arg指針
顯然這個是個萬能的運載指針,這個是用來指向要發送的數據的,數據有兩種一種是駐留在內存中也就是RAM中,另一種是駐留在FLASH中,也就是ROM中,在對待這兩者最大區別是pbuf的分配,如果駐留在內存中,那么將會在RAM中開辟一塊數據區并把arg指針指向的數據搬到這塊內存中,前者不是協議棧管理而是用戶的內存區,后者是協議棧管理的,用戶無權操作。如果是ROM那么好了PBUF只有個頭而已,并沒有分配實際的數據區,他的數據區直接引用FLASH的地址,也就是一般const修飾的,編譯器會把讓他放入FLASH中去。
3、len
數據長度。要發送的數據有多么的長!請告訴他。
4、
apiflags
復制(RAM/ROM)和PSH標志
二、實現
1、如上參數傳進來之后系統先要檢查是否具備發送的條件:

1)、當前TCP狀態是否允許做發送數據的動作?
2)、發送緩沖區的長度是都還夠用?
3)、發送隊列是否超出最大的定義長度?

如果全部通過則繼續,否則自然不必說,返回錯誤代碼給應用程序。
2、  
queuelen = pcb->snd_queuelen
取出當前發送隊列記錄里面的隊列長度,、
3、找出來未發送隊列中是否空?這里只討論空的情況,也就是類似在第一次發送的情況。
所以  pcb->unsent = NULL是成立的。


4、判斷是否copy應用數據到pbuf中。也就是說數據位置在在RAM還是ROM中?
如果RAM中
開始從RAM中分配一片承載len的pbuf。然后 do memcpy
如果是ROM中
那么引用指針到描述符中就OK無須copy。
然后在RAM中分配一個頭部,然后連接起來
也就是頭部+數據(指向ROM中)的結構。

5、queuelen += pbuf_clen(p)
計算出來pbuf數量。由于鏈表的結構所以實現超級簡單
  while (p != NULL) {
    ++len;
    p = p->next;
  }
這樣 queuelen 就是pbuf的數量了也就是p->next的數量,通常是RAMp->next=NULL就是 ++len=1了。

6、建立segment
動態從RAM中分配一塊MEMP_TCP_SEG 長度的segment,
然后就是對這個TCP段進行填充了,比如遠端的端口本地的端口序號、pbuf位置等。重要的是TCP的序號。也會被填入此種段域中記錄。端口這些全部來自pcb中。
7、將段域寫入pcb的usent隊列中去。
queue = seg;
pcb->unsent = queue;
8、更新PCB相關項
  pcb->snd_lbb += len;
  pcb->snd_buf -= len;
下一個序號增加相應的數據長度。發送緩沖區減去已經用掉的字節長度。
9、將發送隊列PBUF個數隊列送入pcb的snd_queuelen。
pcb->snd_queuelen = queuelen;

10、 是否需要設置PSH?果如是設置之。

到這里就完成了對數據存入隊列的全部過程了,當然還有一種情況就是隊列不空的情況,那種情況在開始的時候要處理不過最終還是要計算出來到底有多少個pbuf在里面,是否超過設置最大值等依法炮制。
三:總結

對TCP數據的隊列分清3個地方,

1、是發送緩沖區
2、tcp段隊列
3、pbuf隊列
第一個是以字節為單位的,他被永久的記錄在pcb中的
pcb->snd_buf 中。
第二個是有多少個tcp段,他的單位是segment。他也被永久記錄在 pcb->unsent ,
第三個個是有多少個pbuf單位是pbuf, 他也永久的記錄在pcb->snd_queuelen 。

可見他們的關系基本上是找到PCB就能找到tcp段隊列,找到pbuf隊列,就能找到數據啦。而他們是按照先后順序被連接起來的。應為幾乎所有的結構形式都是以鏈表的形式存在。這樣做個隊列分分鐘的事了就。
等真的發送數據的時候就會從tcp段隊列取出來送到IP層逐層包裝發送。

每次看源碼我都懷著對原作者的極大崇敬,寫程序的小朋友確實不容易啊! 理解!理解!















歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产一区二区欧美 | 欧美一级二级在线观看 | аⅴ资源新版在线天堂 | 久久久精品一区 | 波多野吉衣在线播放 | 超碰520 | 成人午夜av | 超碰免费观看 | 久久精品视频一区二区 | 碰碰视频 | 91欧美| 亚洲精品www久久久 www.蜜桃av | 欧美精品在线一区二区三区 | 黑人巨大精品欧美一区二区免费 | 国产精品久久久久久福利一牛影视 | 羞羞视频网站 | 亚洲av毛片| 国产精品久久av | 亚洲福利在线视频 | 国产精品久久久久久久7电影 | 91麻豆蜜桃一区二区三区 | 国产一区二区在线播放 | 国产成人网 | 一区二区视频免费观看 | 日韩三片| 国产乱码精品一区二区三区中文 | 天天射美女 | 亚洲一区精品视频 | 中文一区 | 99久久精品国产一区二区三区 | 国产成人精品一区二区三 | 久久国产精品一区二区三区 | 青青草视频网站 | 久久精品一区二区三区四区 | 日韩精品免费视频 | 精品国产一区二区在线 | 99久久婷婷国产综合精品电影 | 亚洲视频免费一区 | 天久久 | 国产污视频在线 | 天堂久久av |