LWIP協議 TCP建立流程

2021-09-24 18:28:12 字數 1407 閱讀 7650

如果客戶端發來tcp連線請求,那麼伺服器端就會呼叫tcp_new函式來建立乙個tcp塊。

tcp_new函式的主體內容就是tcp_alloc(tcp_prio_normal)函式,傳遞預設的tcp塊優先順序為64(優先順序範圍1-127)

tcp_alloc:

pcb = (struct tcp_pcb *)memp_malloc(memp_tcp_pcb);

if (pcb == null)

}if (pcb != null)

}

首先分配記憶體,如果記憶體不夠,先釋放出於time-wait狀態的pcb塊,如果依舊分配失敗,則繼續釋放優先順序較低的pcb塊。分配成功後,則對該pcb塊進行初始化。

if (pcb != null) }}

}} if (!ip_addr_isany(ipaddr))

pcb->local_port = port;

tcp_reg(&tcp_bound_pcbs, pcb);

lwip_debugf(tcp_debug, ("tcp_bind: bind to port %"u16_f"\n", port));

return err_ok;

在tcp_bind函式中,首先根據收到的ip位址與埠號,遍歷整個pcb鍊錶(包括四種鍊錶:處於連線狀態的tcp_bound_pcbs,處於監聽狀態的tcp_listen_pcb是,處於time_wait狀態的tcp_tw_pcbs,處於活躍狀態的tcp_active_pcbs),如果遍歷完沒有找到,則將ip位址和埠號賦值給新的pcb塊,並掛起在tcp_bound_pcbs上,可認為該tcp塊處於close狀態。接著,

進入listen狀態的tcp塊等待連線的syn資料報。

接下來的過程就是tcp狀態機的內容了:

tcp_pcb結構體定義(很重要):

struct tcp_pcb ;
其中:

tcp_listen_pcb結構體定義:結構體相比於tcp_pcb更小,更少占用記憶體

struct tcp_pcb_listen ;

TCP協議通訊流程

伺服器呼叫socket bind listen 完成初始化後,呼叫accept 阻塞等待,處於監聽埠的狀態,客戶端呼叫socket 初始化後,呼叫connect 發出syn段並阻塞等待伺服器應答,伺服器應答乙個syn ack段,客戶端收到後從connect 返回,同時應答乙個ack段,伺服器收到後從...

LWIP架構及LWIP協議棧

1 不管是裸機還是os 都分為三個模組 上層協議棧 包括發資料 收資料下面只考慮收資料在中斷中.os 這三者之間是 通過 mbox 通訊 sem 同步的.這三者分別屬於三個執行緒 其中乙個是中斷 裸機三者之間是通過函式呼叫實現的,這三者在同乙個執行緒內.其中乙個是中斷 2 上層 協議棧 收資料之間的...

TCP協議 建立連線

上面第四步的ack報文不占用序列號 為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤 謝希仁版 計算機網路 中的例子是這樣的,已失效的連線請求報文段 的產生在這樣一種情況下 client發出的第乙個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某...