网络协议栈11:Connect函数分解之TCP层
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_ATALK 0x809B????????? /* Appletalk DDP????????? */
#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等結構體中,目的是告知遠端本地的一些情況的信息,以后通信時,就按照現在發送的規格進行了,而真正的數據部分是沒有的。
?
最后,就是把數據發送的網絡層,進行排隊了。
轉載于:https://www.cnblogs.com/image-eye/archive/2012/01/11/2319798.html
總結
以上是生活随笔為你收集整理的网络协议栈11:Connect函数分解之TCP层的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 7 shortcut i
- 下一篇: T-SQL编程基础-基本语法