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位址,也就相當於記錄了兩個網絡卡,而一般情況下,也等於記錄兩台主機。我們知道,...