TCP IP工作流的開始 socket建立3

2021-07-25 14:47:45 字數 2228 閱讀 6019

繼續上次沒有說完的tcp_v4_init_sock函式。

1854 tcp_prequeue_init(tp);

繼續完成對tcp_sock tp的初始化。原始碼中的注釋告訴我們,這個函式是初始化了向使用者傳送資料的佇列,具體引數為tp->ucopy.prequeue。原始碼位於include/net/tcp.h中。

862 static inline

void tcp_prequeue_init(struct tcp_sock *tp)

863

這裡我們見到了tcp_sock的成員ucopy。這裡初始化了它的task,len, memory,prequeue成員。它關係到了tcp以什麼樣的方式把資料傳遞給使用者。它位於include/linux/tcp.h。

270

struct ucopy;

從它的成員的變數型別可以看到:

prequeue是乙個struct sk_buff的佇列,前面提到過struct sk_buff是協議棧各層之間傳遞資料的主要載體。

task是struct task_struct的變數,這個變數型別是os排程程序的變數型別,說明核心是通過任務除錯方式來把資料傳遞給使用者層。為什麼是這個樣子呢?因為到tcp層,乙個tcp連線對應乙個socket,不像是ip層一樣,為所有的tcp連線負責。那麼系統的cpu資源有限,不可能只滿足乙個socket的需要,它要照顧所有的tcp連線。公平起見,大家以程序為載體,等待os公平的分配cpu時鐘週期。

memory成員暫時不知道有什麼用途。

再回到tcp_v4_init_sock

1856 icsk->icsk_rto = tcp_timeout_init;

初始化了icsk的乙個成員變數icsk_rto初始化為tcp_timeout_init。這個常量被定義為3*hz,而hz代表了1s內cpu產生的計時軟中斷(參考linux hz tick jiffies)次數。那麼3*hz代表的時間就是3s。而rto代表原始碼中說的是recovery timeout。本著認真的精神,我去查了rfc 1122,4.2.3節中,給出的說法是retransmission timeout。嚴格來說,這兩者沒有衝突,但顯然重傳更符合情境。重傳機制是tcp保證可靠通訊的一種做法。當一定時間內沒有收到對方的應答ack時,協議認為之前付出的資料分組丟失,或者出錯了。這個時候就要重傳資料分組。重初的時機很重要,協議要根據當前網路的狀況,時時更新重傳的時間。這裡只是初始化了乙個重傳時間為3s。我在我的電腦上ping了下github的官網,得到的rtt(round trip time)是435ms,所以說一般3s的重傳時間足夠了。

1857 tp->mdev = tcp_timeout_init;

這行**中,從tcp_timeout_init可以看出tp->mdev成員變數是和超時有關,但個具體是什麼,從名稱看不出來。原始碼中給出的注釋為,**造成的偏差。目前來看,只能猜測是有關網路裝置的故障造成tcp超時時,重傳的時間間隔。

1864 tp->snd_cwnd = 2;

設定tcp連線的傳送初始視窗。這是tcp協議中流量控制、慢啟動、擁堵控制中的視窗大小的初始值。tcp連線剛剛建立的時候,協議對主機所在網路的情況並不了解,開始就設定了乙個小視窗,數量為2。這個2的單元大小是多少呢?一般是mtu-所有協議棧首部字段位元組。(參考關於網路程式設計中mtu、tcp、udp優化配置的一些總結)。

1869 tp->snd_ssthresh = 0x7fffffff;

這個是慢啟動門限。在門限內,傳送成功一次,視窗就增大為的2倍,當達到門限後,開始執行擁堵避免演算法,增速變慢。剛啟動時設定為無限大。有點不靠譜。千萬記得,此時我們只是在建立基於tcp的socket,協議棧對網路情況資訊,一點不了解。這個設定也可以理解。

1870 tp->snd_cwnd_clamp = ~0;

snd_cwnd_clamp是對傳送視窗設定的乙個門限,也就是無論如何,傳送視窗大小都不能超過這個值的大小。~0是對0按位取反,得到的結果就是全f。snd_cwnd_clamp的型別為unsigned的,將~0賦給它以後,在我32位作業系統上就是32位個1,也就是0xffffffff。同樣是很大的乙個數,先放著。

1871 tp->mss_cache = 536;

mss是maximum segement size的縮寫。翻譯為最大報文長度。mss = mtu - tcp頭部 - ip首部(參考tcp mss)。這裡設定了它的快取大小,暫時理解為個數。536位元組的話,也太小了。一般mtu=1500位元組來計算的話,也不到1m記憶體,不是很大。

又說不完了,下次繼續。

TCP IP工作流5 connect開始

這個函式原型中,sockfd是就用socket呼叫得到乙個socket的檔案id。addr引數是,遠端要連線到的伺服器的位址了。addrlen是這個位址的描述符的長度。這裡,我就有了乙個疑問了,struct sockaddr的型別是確定的,為什麼這裡要要求乙個長度呢?看原始碼當然能找到答案,我們先猜...

工作流建模 工作流概念

工作流建模 工作流概念 1 案例 工作流系統得基本目的是處理案例。每個案例都有乙個唯一標識,而且每個案例的生命週期都是有限的。案例生命週期都處於某個特定狀態,該狀態由三個元素組成 1 案例相關的屬性的值 案例屬性是一系列同案例相關的變數。能夠用來管理案例。正是通過這些變數,才有可能指出在特定條件下某...

工作流 一 什麼是工作流

什麼是工作流 工作流的英文全稱是 workflow,簡單理解則是業務流程的計算機化或自動化。它是是針對工作中具有固定程式的常規活動而提出的乙個概念,通過將工作活動分解定義良好的任務 角色 規則和過程來進行執行和監控,達到提高生產組織水平和工作效率的目的。工作流技術發端於70年代中期辦公自動化領域的研...