linux0 99網路模組 網路層 傳送

2021-07-06 01:51:02 字數 1825 閱讀 8079

在tcp的write系統呼叫中呼叫了下面的函式用於資料報的傳送

net/tep/tcp.c

852       prot->queue_xmit (sk, dev, skb,0);

來看一下tcp註冊的

queue_xmit:

net/tcp/tcp.c

3185 struct proto tcp_prot =

3201   ip_queue_xmit,

在udp的write系統呼叫中呼叫了下面的語句:

net/tcp/udp.c

451  sk->prot->queue_xmit (sk, dev, skb,1);

看一下udp協議註冊的queue_xmit函式:

net/tcp/udp.c

745 struct proto udp_prot =

746

811   skb->free = free;

812   skb->dev = dev;

813   skb->when = jiffies;

814   printk(">>\n");

815   ptr = (unsigned char *)(skb + 1);     //指向鏈路層首部

816   ptr += dev->hard_header_len;     //指向ip層首部

817   iph = (struct ip_header *)ptr;     //轉換為ip_header

818   iph->tot_len = net16(skb->len-dev->hard_header_len);

819   ip_send_check (iph);

818-819行看函式上面的第二段注釋

820   print_iph(iph);

821   skb->next = null;

823   /* see if this is the one

824      trashing our queue. */

825   skb->magic = 1;

827   if (!free)     //如果不銷毀傳送過的資料報,就把它加到重傳佇列中

828    

837       else

838    

842       sti();

843       sk->time_wait.len = sk->rtt*2;

844       sk->timeout=time_write;

845       reset_timer ((struct timer *)&sk->time_wait);

設定超時時間,重置定時器

846    }

847   else

848    

851   if (dev->up)

852    

857        else

858     

861     }

862   else

863    

867 }

總結

通過執行應用層的系統呼叫,已經把使用者空間資料封裝成了sk_buffer,然後呼叫本函式,在這裡設定了資料報的幾個屬性和ip首部的總長度字段,計算了校驗和。對於tcp來說,引數free為0,資料報在傳送之前會被加入到重傳佇列,對於udp來說引數free為1,也就是不採用重傳機制,udp需要把引數中的sock關聯到資料報中。接下來,如果dev的up欄位為1,就呼叫裝置的傳送函式。否則,對於udp而言就在此釋放資料報所占用的寫空間。

TCP IP 網路基礎(二)網路層

ip位址和ip協議基本上構成了網路層的核心和全部。而網路層又是 tcp ip 的心臟,或者是精華 還拿前面的例子來說,資料鏈路層負責網路內 直連 廣義的直連也包括通過交換機 集線器等連起來 的裝置的通訊,而ip協議 又叫網際協議 負責網路間的連通。也就是說,資料鏈路層相當於快遞員騎著小電驢在你小區裡...

8 5網路層 路由

路由 跨越從源主機到目標主機的乙個網際網路來 資料報的過程。路由器 將資料報 到正確目的地,並且在 過程中選擇最佳路徑的裝置 路由器乙個介面乙個網段 路由表是記憶體裡的,停電會丟失的。路由器裡有路由表,還有哪些裝置裡有路由表?三層交換機,電腦,路由的型別 靜態路由 人工新增 預設路由 不能找到匹配的...

linux網路 (三) 網路測試

1.ping 測試主機之間的網路連通性 ping命令是基於internet控制訊息協議 icmp協議 來工作的,icmp報文通過ip協議來傳送。ping傳送的是icmp回顯請求,回答的是回顯應答報文。常用選項引數 1.1.用 c 選項指定傳送的測試報文數目 傳送指定的資料報數預設值是3。ping c...