在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...