網路協議棧11 Connect函式分解之TCP層

2021-09-08 23:03:48 字數 2783 閱讀 8529

connect函式之分解1.

首先,connect函式從引數獲得遠端的ip,把這個位址賦值給對應的sock結構體的對應變數,並設定了sock結構體中的一些其他變數後,首先分配(skb_buff+使用者空間)大小記憶體,這兩部分是通過呼叫kmalloc(sizeof(struct skb_buff)+size,priority)來分配的,分配後兩個資料塊是連續的位址;分配後的記憶體如下

接下來,就是初始化這個剛剛分配好的skb_buff結構體的一些指標成員,之後,把整個資料空間的首位址返回給乙個skb_buff指標,以後對skb結構體的操作,就通過這個指標來完成了。接著,把skb_buff跟sock關聯起來,即把skb_buff的成員sk設定為對應的sock,路由指向本地路由,就開始配置通訊資料了。

第一步,把指標指向skb_buff空間的資料空間,即skb_buff的成員data所指向的位址(上圖 5)。

第二步(上圖 1),設定乙太網頭部(本地mac位址6位元組+遠端mac位址6位元組+資料幀型別2位元組),把本地mac位址複製到資料空間的開始處,本地的mac位址,是從本地路由中獲得,而目的mac位址一般為null,如果為null,則需要設定skb_buff成員arp為0,表示遠端mac位址(或者下一跳mac位址)並不知道,需要在傳送資料之前使用arp來查詢,資料幀可以選擇:

#define eth_p_loop  0x0060           /* ethernet loopback packet  */

#define eth_p_echo  0x0200           /* ethernet echo packet        */

#define eth_p_pup     0x0400           /* xerox pup packet            */

#define eth_p_ip 0x0800           /* internet protocol packet    */

#define eth_p_arp     0x0806           /* address resolution packet */

#define eth_p_rarp      0x8035          /* reverse addr res packet   */

#define eth_p_x25     0x0805           /* ccitt x.25                     */

#define eth_p_ipx      0x8137           /* ipx over dix                  */

#define eth_p_802_3   0x0001           /* dummy type for 802.3 frames  */

#define eth_p_ax25   0x0002           /* dummy protocol id for ax.25  */

#define eth_p_all     0x0003           /* every packet (be careful!!!) */

#define eth_p_802_2   0x0004           /* 802.2 frames            */

#define eth_p_snap  0x0005           /* internal only             */

第三步,指標跳過乙太網首部14位元組,指向ip首部(上圖 2),跟著就是資料空間初始化ip首部,ip首部的資料基本上在sock結構體中都有用,現在只是從sock結構體複製過來,初始化完後,在skb_buff中還有乙個專門的指標指向資料空間的ip首部的位址的成員ip_hdr,此時也初始化一下。

第四步,指標跳過ip首部,指向tcp首部(上圖 3),跟著初始化資料空間的tcp首部,tcp首部一些是從sock結構體中複製的,一些是在這裡第一次被賦值的,注意tcp首部不包含tcp選項部分,因此,需要把指標跳過tcp首部後,指向tcp的選項部分,進行初始化,才算把tcp初始化完成(把mss賦值到選項部分)(上圖 4)。

到此,我們就把資料空間初始化完,我們在開始時分配資料空間大小為44+18,現在使用的是14(mac)+20(tcp)+20(ip)+4(mss),也就用完了,從這裡,我們看到,connect函式傳送的資料,都是本地的一些資訊,包裝到mac,tcp,ip等結構體中,目的是告知遠端本地的一些情況的資訊,以後通訊時,就按照現在傳送的規格進行了,而真正的資料部分是沒有的。

最後,就是把資料傳送的網路層,進行排隊了。

linux網路程式設計系列之connect函式詳解

在講解套接字程式設計函式之前,有必要對socket程式設計的兩個不可或缺的結構體進行說明。includestruct sockaddr 由於歷史的原因,套接字函式中 如connect,bind等 使用的引數型別大多是sockaddr型別的。而如今進行套接字程式設計的時候大都使用sockaddr in...

網路協議棧7 connect 函式之前之IP

網路協議棧7 connect 函式之前之ip tcp的下一層,就是ip internet protocol,網路協議 ip的結構圖和結構體如下 ip首部結構體 struct iphdr ip首部主要記錄了鏈路連線兩端的ip位址,也就相當於記錄了兩個網絡卡,而一般情況下,也等於記錄兩台主機。我們知道,...

網路協議棧7 connect 函式之前之IP

網路協議棧7 connect 函式之前之ip tcp的下一層,就是ip internet protocol,網路協議 ip的結構圖和結構體如下 ip首部結構體 struct iphdr ip首部主要記錄了鏈路連線兩端的ip位址,也就相當於記錄了兩個網絡卡,而一般情況下,也等於記錄兩台主機。我們知道,...