色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux內核網絡數據包發送在UDP協議層的處理

B4Pb_gh_6fde77c ? 來源:linux內核之旅 ? 作者:梁金榮 ? 2021-08-04 16:23 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 前言

本文分享了Linux內核網絡數據包發送在UDP協議層的處理,主要分析了udp_sendmsg和udp_send_skb函數,并分享了UDP層的數據統計和監控以及socket發送隊列大小的調優。

2. udp_sendmsg

這個函數定義在 net/ipv4/udp.c,函數很長,分段來看。

2.1 UDP corking

在變量聲明和基本錯誤檢查之后,udp_sendmsg 所做的第一件事就是檢查 socket 是否“ 塞住”了(corked)。UDP corking 是一項優化技術,允許內核將多次數據累積成單個數據報發送。在用戶程序中有兩種方法可以啟用此選項:

使用 setsockopt 系統調用設置 socket 的 UDP_CORK 選項

程序調用 send,sendto 或 sendmsg 時,帶 MSG_MORE 參數

udp_sendmsg 代碼檢查 up-》pending 以確定 socket 當前是否已被塞住(corked),如果是, 則直接跳到 do_append_data 進行數據追加(append)。

int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,

size_t len)

{

/* variables and error checking 。。。 */

fl4 = &inet-》cork.fl.u.ip4;

if (up-》pending) {

/*

* There are pending frames.

* The socket lock must be held while it‘s corked.

*/

lock_sock(sk);

if (likely(up-》pending)) {

if (unlikely(up-》pending != AF_INET)) {

release_sock(sk);

return -EINVAL;

}

goto do_append_data;

}

release_sock(sk);

}

2.2 獲取目的 IP 地址和端口

接下來獲取目的 IP 地址和端口,有兩個可能的來源:

如果之前 socket 已經建立連接,那 socket 本身就存儲了目標地址

地址通過輔助結構(struct msghdr)傳入,正如我們在 sendto 的內核代碼中看到的那樣

具體邏輯:

/*

* Get and verify the address.

*/

if (msg-》msg_name) {

struct sockaddr_in *usin = (struct sockaddr_in *)msg-》msg_name;

if (msg-》msg_namelen 《 sizeof(*usin))

return -EINVAL;

if (usin-》sin_family != AF_INET) {

if (usin-》sin_family != AF_UNSPEC)

return -EAFNOSUPPORT;

}

daddr = usin-》sin_addr.s_addr;

dport = usin-》sin_port;

if (dport == 0)

return -EINVAL;

} else {

if (sk-》sk_state != TCP_ESTABLISHED)

return -EDESTADDRREQ;

daddr = inet-》inet_daddr;

dport = inet-》inet_dport;

/* Open fast path for connected socket.

Route will not be used, if at least one option is set.

*/

connected = 1;

}

UDP 代碼中出現了 TCP_ESTABLISHED!UDP socket 的狀態使用了 TCP 狀態來描述。上面的代碼顯示了內核如何解析該變量以便設置 daddr 和 dport。

如果沒有 struct msghdr 變量,內核函數到達 udp_sendmsg 函數時,會從 socket 本身檢索目的地址和端口,并將 socket 標記為“已連接”。

2.3 Socket 發送:bookkeeping 和打時間戳

接下來,獲取存儲在 socket 上的源地址、設備索引(device index)和時間戳選項(例如SOCK_TIMESTAMPING_TX_HARDWARE, SOCK_TIMESTAMPING_TX_SOFTWARE, SOCK_WIFI_STATUS):

ipc.addr = inet-》inet_saddr;

ipc.oif = sk-》sk_bound_dev_if;

sock_tx_timestamp(sk, &ipc.tx_flags);

2.4 輔助消息(Ancillary messages)

除了發送或接收數據包之外,sendmsg 和 recvmsg 系統調用還允許用戶設置或請求輔助數據。用戶程序可以通過將請求信息組織成 struct msghdr 類型變量來利用此輔助數據。一些輔助數據類型記錄在IP man page中 。

輔助數據的一個常見例子是 IP_PKTINFO。對于 sendmsg,IP_PKTINFO 允許程序在發送數據時設置一個 in_pktinfo 變量。程序可以通過填寫 struct in_pktinfo 變量中的字段來指定要在 packet 上使用的源地址。如果程序是監聽多個 IP 地址的服務端程序,那這是一個很有用的選項。在這種情況下,服務端可能想使用客戶端連接服務端的那個 IP 地址來回復客戶端,IP_PKTINFO 非常適合這種場景。

setsockopt 可以在socket 級別設置發送包的 IP_TTL和 IP_TOS。而輔助消息允許在每個數據包級別設置 TTL 和 TOS 值。Linux 內核會使用一個數組將 TOS 轉換為優先級,后者會影響數據包如何以及何時從 qdisc 中發送出去。

可以看到內核如何在 UDP socket 上處理 sendmsg 的輔助消息:

if (msg-》msg_controllen) {

err = ip_cmsg_send(sock_net(sk), msg, &ipc,

sk-》sk_family == AF_INET6);

if (err)

return err;

if (ipc.opt)

free = 1;

connected = 0;

}

解析輔助消息的工作是由 ip_cmsg_send 完成的,定義在 net/ipv4/ip_sockglue.c 。傳遞一個未初始化的輔助數據,將會把這個 socket 標記為“未建立連接的”。

2.5 設置自定義 IP 選項

接下來,sendmsg 將檢查用戶是否通過輔助消息設置了的任何自定義 IP 選項。如果設置了 ,將使用這些自定義值;如果沒有,那就使用 socket 中(已經在用)的參數:

if (!ipc.opt) {

struct ip_options_rcu *inet_opt;

rcu_read_lock();

inet_opt = rcu_dereference(inet-》inet_opt);

if (inet_opt) {

memcpy(&opt_copy, inet_opt,

sizeof(*inet_opt) + inet_opt-》opt.optlen);

ipc.opt = &opt_copy.opt;

}

rcu_read_unlock();

}

接下來,該函數檢查是否設置了源記錄路由(source record route, SRR)IP 選項。SRR 有兩種類型:寬松源記錄路由和嚴格源記錄路由。如果設置了此選項,則會記錄第一跳地址并將其保存到 faddr,并將 socket 標記為“未連接”。這將在后面用到:

ipc.addr = faddr = daddr;

if (ipc.opt && ipc.opt-》opt.srr) {

if (!daddr)

return -EINVAL;

faddr = ipc.opt-》opt.faddr;

connected = 0;

}

處理完 SRR 選項后,將處理 TOS 選項,這可以從輔助消息中獲取,或者從 socket 當前值中獲取。然后檢查:

是否(使用 setsockopt)在 socket 上設置了 SO_DONTROUTE,或

是否(調用 sendto 或 sendmsg 時)指定了 MSG_DONTROUTE 標志,或

是否已設置了 is_strictroute,表示需要嚴格的 SRR 任何一個為真,tos 字段的 RTO_ONLINK 位將置 1,并且 socket 被視為“未連接”:

tos = get_rttos(&ipc, inet);

if (sock_flag(sk, SOCK_LOCALROUTE) ||

(msg-》msg_flags & MSG_DONTROUTE) ||

(ipc.opt && ipc.opt-》opt.is_strictroute)) {

tos |= RTO_ONLINK;

connected = 0;

}

2.6 多播或單播(Multicast or unicast)

接下來代碼開始處理 multicast。這有點復雜,因為用戶可以通過 IP_PKTINFO 輔助消息 來指定發送包的源地址或設備號,如前所述。

如果目標地址是多播地址:

將多播設備(device)的索引(index)設置為發送(寫)這個 packet 的設備索引,并且

packet 的源地址將設置為 multicast 源地址

如果目標地址不是一個組播地址,則發送 packet 的設備制定為 inet-》uc_index(單播), 除非用戶使用 IP_PKTINFO 輔助消息覆蓋了它。

if (ipv4_is_multicast(daddr)) {

if (!ipc.oif)

ipc.oif = inet-》mc_index;

if (!saddr)

saddr = inet-》mc_addr;

connected = 0;

} else if (!ipc.oif)

ipc.oif = inet-》uc_index;

2.7 路由

現在開始路由,UDP 層中處理路由的代碼以快速路徑(fast path)開始。如果 socket 已連接,則直接嘗試獲取路由:

if (connected)

rt = (struct rtable *)sk_dst_check(sk, 0);

如果 socket 未連接,或者雖然已連接,但路由輔助函數 sk_dst_check 認定路由已過期,則代碼將進入慢速路徑(slow path)以生成一條路由記錄。首先調用 flowi4_init_output 構造一個描述此 UDP 流的變量:

if (rt == NULL) {

struct net *net = sock_net(sk);

fl4 = &fl4_stack;

flowi4_init_output(fl4, ipc.oif, sk-》sk_mark, tos,

RT_SCOPE_UNIVERSE, sk-》sk_protocol,

inet_sk_flowi_flags(sk)|FLOWI_FLAG_CAN_SLEEP,

faddr, saddr, dport, inet-》inet_sport);

然后,socket 及其 flow 實例會傳遞給安全子系統,這樣 SELinux 或 SMACK 這樣的系統就可以在 flow 實例上設置安全 ID。接下來,ip_route_output_flow 將調用 IP 路由代碼,創建一個路由實例:

security_sk_classify_flow(sk, flowi4_to_flowi(fl4));

rt = ip_route_output_flow(net, fl4, sk);

如果創建路由實例失敗,并且返回碼是 ENETUNREACH, 則 OUTNOROUTES 計數器將會加 1。

if (IS_ERR(rt)) {

err = PTR_ERR(rt);

rt = NULL;

if (err == -ENETUNREACH)

IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES);

goto out;

}

這些統計計數器所在的源文件、其他可用的計數器及其含義,將在下面的 UDP 監控部分分享。

接下來,如果是廣播路由,但 socket 的 SOCK_BROADCAST 選項未設置,則處理過程終止。如果 socket 被視為“已連接”,則路由實例將緩存到 socket 上:

err = -EACCES;

if ((rt-》rt_flags & RTCF_BROADCAST) &&

!sock_flag(sk, SOCK_BROADCAST))

goto out;

if (connected)

sk_dst_set(sk, dst_clone(&rt-》dst));

2.8 MSG_CONFIRM: 阻止 ARP 緩存過期

如果調用 send, sendto 或 sendmsg 的時候指定了 MSG_CONFIRM 參數,UDP 協議層將會如下處理:

if (msg-》msg_flags&MSG_CONFIRM)

goto do_confirm;

back_from_confirm:

該標志提示系統去確認一下 ARP 緩存條目是否仍然有效,防止其被垃圾回收。 do_confirm 標簽位于此函數末尾處:

do_confirm:

dst_confirm(&rt-》dst);

if (!(msg-》msg_flags&MSG_PROBE) || len)

goto back_from_confirm;

err = 0;

goto out;

dst_confirm 函數只是在相應的緩存條目上設置一個標記位,稍后當查詢鄰居緩存并找到 條目時將檢查該標志,我們后面一些會看到。此功能通常用于 UDP 網絡應用程序,以減少不必要的 ARP 流量。此代碼確認緩存條目然后跳回 back_from_confirm 標簽。一旦 do_confirm 代碼跳回到 back_from_confirm(或者之前就沒有執行到 do_confirm ),代碼接下來將處理 UDP cork 和 uncorked 情況。

2.9 uncorked UDP sockets 快速路徑:準備待發送數據

如果不需要 corking,數據就可以封裝到一個 struct sk_buff 實例中并傳遞給 udp_send_skb,離 IP 協議層更進了一步。這是通過調用 ip_make_skb 來完成的。

先前通過調用 ip_route_output_flow 生成的路由條目也會一起傳進來, 它將保存到 skb 里。

/* Lockless fast path for the non-corking case. */

if (!corkreq) {

skb = ip_make_skb(sk, fl4, getfrag, msg-》msg_iov, ulen,

sizeof(struct udphdr), &ipc, &rt,

msg-》msg_flags);

err = PTR_ERR(skb);

if (!IS_ERR_OR_NULL(skb))

err = udp_send_skb(skb, fl4);

goto out;

}

ip_make_skb 函數將創建一個 skb,其中需要考慮到很多的事情,例如:

MTU

UDP corking(如果啟用)

UDP Fragmentation Offloading(UFO)

Fragmentation(分片):如果硬件不支持 UFO,但是要傳輸的數據大于 MTU,需要軟件做分片

大多數網絡設備驅動程序不支持 UFO,因為網絡硬件本身不支持此功能。我們來看下這段代碼,先看 corking 禁用的情況。

2.9.1 ip_make_skb

定義在net/ipv4/ip_output.c,這個函數有點復雜。

構建 skb 的時候,ip_make_skb 依賴的底層代碼需要使用一個 corking 變量和一個 queue 變量 ,skb 將通過 queue 變量傳入。如果 socket 未被 cork,則會傳入一個假的 corking 變量和一個空隊列。

現在來看看假 corking 變量和空隊列是如何初始化的:

struct sk_buff *ip_make_skb(struct sock *sk, /* more args */)

{

struct inet_cork cork;

struct sk_buff_head queue;

int err;

if (flags & MSG_PROBE)

return NULL;

__skb_queue_head_init(&queue);

cork.flags = 0;

cork.addr = 0;

cork.opt = NULL;

err = ip_setup_cork(sk, &cork, /* more args */);

if (err)

return ERR_PTR(err);

如上所示,cork 和 queue 都是在棧上分配的,ip_make_skb 根本不需要它。 ip_setup_cork 初始化 cork 變量。接下來,調用__ip_append_data 并傳入 cork 和 queue 變 量:

err = __ip_append_data(sk, fl4, &queue, &cork,

¤t-》task_frag, getfrag,

from, length, transhdrlen, flags);

我們將在后面看到這個函數是如何工作的,因為不管 socket 是否被 cork,最后都會執行它。

現在,我們只需要知道__ip_append_data 將創建一個 skb,向其追加數據,并將該 skb 添加 到傳入的 queue 變量中。如果追加數據失敗,則調用__ip_flush_pending_frame 丟棄數據 并向上返回錯誤(指針類型):

if (err) {

__ip_flush_pending_frames(sk, &queue, &cork);

return ERR_PTR(err);

}

最后,如果沒有發生錯誤,__ip_make_skb 將 skb 出隊,添加 IP 選項,并返回一個準備好傳遞給更底層發送的 skb:

return __ip_make_skb(sk, fl4, &queue, &cork);

2.9.2 發送數據

如果沒有錯誤,skb 就會交給 udp_send_skb,后者會繼續將其傳給下一層協議,IP 協議:

err = PTR_ERR(skb);

if (!IS_ERR_OR_NULL(skb))

err = udp_send_skb(skb, fl4);

goto out;

如果有錯誤,錯誤計數就會有相應增加。后面的“錯誤計數”部分會詳細介紹。

2.10 沒有被 cork 的數據時的慢路徑

如果使用了 UDP corking,但之前沒有數據被 cork,則慢路徑開始:

對 socket 加鎖

檢查應用程序是否有 bug:已經被 cork 的 socket 是否再次被 cork

設置該 UDP flow 的一些參數,為 corking 做準備

將要發送的數據追加到現有數據

udp_sendmsg 代碼繼續向下看,就是這一邏輯:

lock_sock(sk);

if (unlikely(up-》pending)) {

/* The socket is already corked while preparing it. */

/* 。。。 which is an evident application bug. --ANK */

release_sock(sk);

LIMIT_NETDEBUG(KERN_DEBUG pr_fmt(“cork app bug 2

”));

err = -EINVAL;

goto out;

}

/*

* Now cork the socket to pend data.

*/

fl4 = &inet-》cork.fl.u.ip4;

fl4-》daddr = daddr;

fl4-》saddr = saddr;

fl4-》fl4_dport = dport;

fl4-》fl4_sport = inet-》inet_sport;

up-》pending = AF_INET;

do_append_data:

up-》len += ulen;

err = ip_append_data(sk, fl4, getfrag, msg-》msg_iov, ulen,

sizeof(struct udphdr), &ipc, &rt,

corkreq ? msg-》msg_flags|MSG_MORE : msg-》msg_flags);

2.10.1 ip_append_data

這個函數簡單封裝了__ip_append_data,在調用后者之前,做了兩件重要的事情:

檢查是否從用戶傳入了 MSG_PROBE 標志。該標志表示用戶不想真正發送數據,只是做路徑探測(例如,確定PMTU)

檢查 socket 的發送隊列是否為空。如果為空,意味著沒有 cork 數據等待處理,因此調用 ip_setup_cork 來設置 corking

一旦處理了上述條件,就調用__ip_append_data 函數,該函數包含用于將數據處理成數據包的大量邏輯。

2.10.2 __ip_append_data

如果 socket 是 corked,則從 ip_append_data 調用此函數;如果 socket 未被 cork,則從 ip_make_skb 調用此函數。在任何一種情況下,函數都將分配一個新緩沖區來存儲傳入的數據,或者將數據附加到現有數據中。這種工作的方式圍繞 socket 的發送隊列。等待發送的現有數據(例如,如果 socket 被 cork) 將在隊列中有一個對應條目,可以被追加數據。

這個函數很復雜,它執行很多計算以確定如何構造傳遞給下面的網絡層的 skb。

該函數的重點包括:

如果硬件支持,則處理 UDP Fragmentation Offload(UFO)。絕大多數網絡硬件不支持 UFO。如果你的網卡驅動程序支持它,它將設置 NETIF_F_UFO 標記位

處理支持分散/收集( scatter/gather)IO 的網卡。許多 卡都支持此功能,并使用 NETIF_F_SG 標志進行通告。支持該特性的網卡可以處理數據 被分散到多個 buffer 的數據包;內核不需要花時間將多個緩沖區合并成一個緩沖區中。避 免這種額外的復制會提升性能,大多數網卡都支持此功能

通過調用 sock_wmalloc 跟蹤發送隊列的大小。當分配新的 skb 時,skb 的大小由創建它 的 socket 計費(charge),并計入 socket 發送隊列的已分配字節數。如果發送隊列已經 沒有足夠的空間(超過計費限制),則 skb 并分配失敗并返回錯誤。我們將在下面的調優部分中看到如何設置 socket 發送隊列大小(txqueuelen)

更新錯誤統計信息。此函數中的任何錯誤都會增加“discard”計數。我們將在下面的監控部分中看到如何讀取此值

函數執行成功后返回 0,以及一個適用于網絡設備傳輸的 skb。

在 unorked 情況下,持有 skb 的 queue 被作為參數傳遞給上面描述的__ip_make_skb,在那里 它被出隊并通過 udp_send_skb 發送到更底層。

在 cork 的情況下,__ip_append_data 的返回值向上傳遞。數據位于發送隊列中,直到 udp_sendmsg 確定是時候調用 udp_push_pending_frames 來完成 skb,后者會進一步調用 udp_send_skb。

2.10.3 Flushing corked sockets

現在,udp_sendmsg 會繼續,檢查__ip_append_skb 的返回值(錯誤碼):

if (err)

udp_flush_pending_frames(sk);

else if (!corkreq)

err = udp_push_pending_frames(sk);

else if (unlikely(skb_queue_empty(&sk-》sk_write_queue)))

up-》pending = 0;

release_sock(sk);

我們來看看每個情況:

如果出現錯誤(錯誤為非零),則調用 udp_flush_pending_frames,這將取消 cork 并從 socket 的發送隊列中刪除所有數據

如果在未指定 MSG_MORE 的情況下發送此數據,則調用 udp_push_pending_frames,它將數據傳遞到更下面的網絡層

如果發送隊列為空,請將 socket 標記為不再 cork

如果追加操作完成并且有更多數據要進入 cork,則代碼將做一些清理工作,并返回追加數據的長度:

ip_rt_put(rt);

if (free)

kfree(ipc.opt);

if (!err)

return len;

這就是內核如何處理 corked UDP sockets 的。

2.11 Error accounting

如果:

non-corking 快速路徑創建 skb 失敗,或 udp_send_skb 返回錯誤,或

ip_append_data 無法將數據附加到 corked UDP socket,或

當 udp_push_pending_frames 調用 udp_send_skb 發送 corked skb 時后者返回錯誤

僅當返回的錯誤是 ENOBUFS(內核無可用內存)或 socket 已設置 SOCK_NOSPACE(發送隊列已滿)時,SNDBUFERRORS 統計信息才會增加:

/*

* ENOBUFS = no kernel mem, SOCK_NOSPACE = no sndbuf space. Reporting

* ENOBUFS might not be good (it’s not tunable per se), but otherwise

* we don‘t have a good statistic (IpOutDiscards but it can be too many

* things)。 We could add another new stat but at least for now that

* seems like overkill.

*/

if (err == -ENOBUFS || test_bit(SOCK_NOSPACE, &sk-》sk_socket-》flags)) {

UDP_INC_STATS_USER(sock_net(sk),

UDP_MIB_SNDBUFERRORS, is_udplite);

}

return err;

我們接下來會在后面的數據監控里看到如何讀取這些計數。

3. udp_send_skb

udp_sendmsg 通過調用 udp_send_skb 函數將 skb 送到下一網絡層,在本文中是 IP 協議層。這個函數做了一些重要的事情:

向 skb 添加 UDP 頭

處理校驗和:軟件校驗和,硬件校驗和或無校驗和(如果禁用)

調用 ip_send_skb 將 skb 發送到 IP 協議層

更新發送成功或失敗的統計計數器

首先,創建 UDP 頭:

static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4)

{

/* useful variables 。。。 */

/*

* Create a UDP header

*/

uh = udp_hdr(skb);

uh-》source = inet-》inet_sport;

uh-》dest = fl4-》fl4_dport;

uh-》len = htons(len);

uh-》check = 0;

接下來,處理校驗和。有幾種情況:

首先處理 UDP-Lite 校驗和

接下來,如果 socket 校驗和選項被關閉(setsockopt 帶 SO_NO_CHECK 參數),它將被標記為校 驗和關閉

接下來,如果硬件支持 UDP 校驗和,則將調用 udp4_hwcsum 來設置它。請注意,如果數 據包是分段的,內核將在軟件中生成校驗和,可以在 udp4_hwcsum 的源代碼中看到這一點

最后,通過調用 udp_csum 生成軟件校驗和

if (is_udplite) /* UDP-Lite */

csum = udplite_csum(skb);

else if (sk-》sk_no_check == UDP_CSUM_NOXMIT) { /* UDP csum disabled */

skb-》ip_summed = CHECKSUM_NONE;

goto send;

} else if (skb-》ip_summed == CHECKSUM_PARTIAL) { /* UDP hardware csum */

udp4_hwcsum(skb, fl4-》saddr, fl4-》daddr);

goto send;

} else

csum = udp_csum(skb);

接下來,添加了偽頭 :

uh-》check = csum_tcpudp_magic(fl4-》saddr, fl4-》daddr, len,

sk-》sk_protocol, csum);

if (uh-》check == 0)

uh-》check = CSUM_MANGLED_0;

如果校驗和為 0,則根據 RFC 768,校驗為全 1( transmitted as all ones (the equivalent in one’s complement arithmetic))。最后,將 skb 傳遞給 IP 協議層并增加統計計數:

send:

err = ip_send_skb(sock_net(sk), skb);

if (err) {

if (err == -ENOBUFS && !inet-》recverr) {

UDP_INC_STATS_USER(sock_net(sk),

UDP_MIB_SNDBUFERRORS, is_udplite);

err = 0;

}

} else

UDP_INC_STATS_USER(sock_net(sk),

UDP_MIB_OUTDATAGRAMS, is_udplite);

return err;

如果 ip_send_skb 成功,將更新 OUTDATAGRAMS 統計。如果 IP 協議層報告錯誤,并且錯誤 是 ENOBUFS(內核缺少內存)而且錯誤 queue(inet-》recverr)沒有啟用,則更新 SNDBUFERRORS。

接下來看看如何在 Linux 內核中監視和調優 UDP 協議層。

4. 監控:UDP 層統計

兩個非常有用的獲取 UDP 協議統計文件:

/proc/net/snmp

/proc/net/udp

4.1 /proc/net/snmp

監控 UDP 協議層統計:

cat /proc/net/snmp | grep Udp:

642fceec-f497-11eb-9bcf-12bb97331649.png

要準確地理解這些計數,需要仔細地閱讀內核代碼。一些類型的錯誤計數并不是只出現在一種計數中,而可能是出現在多個計數中。

InDatagrams: Incremented when recvmsg was used by a userland program to read datagram. Also incremented when a UDP packet is encapsulated and sent back for processing.

NoPorts: Incremented when UDP packets arrive destined for a port where no program is listening.

InErrors: Incremented in several cases: no memory in the receive queue, when a bad checksum is seen, and if sk_add_backlog fails to add the datagram.

OutDatagrams: Incremented when a UDP packet is handed down without error to the IP protocol layer to be sent.

RcvbufErrors: Incremented when sock_queue_rcv_skb reports that no memory is available; this happens if sk-》sk_rmem_alloc is greater than or equal to sk-》sk_rcvbuf.

SndbufErrors: Incremented if the IP protocol layer reported an error when trying to send the packet and no error queue has been setup. Also incremented if no send queue space or kernel memory are available.

InCsumErrors: Incremented when a UDP checksum failure is detected. Note that in all cases I could find, InCsumErrors is incremented at the same time as InErrors. Thus, InErrors - InCsumErros should yield the count of memory related errors on the receive side.

UDP 協議層發現的某些錯誤會出現在其他協議層的統計信息中。一個例子:路由錯誤 。 udp_sendmsg 發現的路由錯誤將導致 IP 協議層的 OutNoRoutes 統計增加。

4.2 /proc/net/udp

監控 UDP socket 統計:

cat /proc/net/udp

每一列的意思:

sl: Kernel hash slot for the socket

local_address: Hexadecimal local address of the socket and port number, separated by :。

rem_address: Hexadecimal remote address of the socket and port number, separated by :。

st: The state of the socket. Oddly enough, the UDP protocol layer seems to use some TCP socket states. In the example above, 7 is TCP_CLOSE.

tx_queue: The amount of memory allocated in the kernel for outgoing UDP datagrams.

rx_queue: The amount of memory allocated in the kernel for incoming UDP datagrams.

tr, tm-》when, retrnsmt: These fields are unused by the UDP protocol layer.

uid: The effective user id of the user who created this socket.

timeout: Unused by the UDP protocol layer.

inode: The inode number corresponding to this socket. You can use this to help you determine which user process has this socket open. Check /proc/[pid]/fd, which will contain symlinks to socket[:inode]。

ref: The current reference count for the socket.

pointer: The memory address in the kernel of the struct sock.

drops: The number of datagram drops associated with this socket. Note that this does not include any drops related to sending datagrams (on corked UDP sockets or otherwise); this is only incremented in receive paths as of the kernel version examined by this blog post.

打印這些計數的代碼在net/ipv4/udp.c。

5. 調優:socket 發送隊列內存大小

發送隊列(也叫“寫隊列”)的最大值可以通過設置 net.core.wmem_max sysctl 進行修改。

$ sudo sysctl -w net.core.wmem_max=8388608

sk-》sk_write_queue 用 net.core.wmem_default 初始化, 這個值也可以調整。

調整初始發送 buffer 大小:

$ sudo sysctl -w net.core.wmem_default=8388608

也可以通過從應用程序調用 setsockopt 并傳遞 SO_SNDBUF 來設置 sk-》sk_write_queue 。通過 setsockopt 設置的最大值是 net.core.wmem_max。

不過,可以通過 setsockopt 并傳遞 SO_SNDBUFFORCE 來覆蓋 net.core.wmem_max 限制, 這需要 CAP_NET_ADMIN 權限。

每次調用__ip_append_data 分配 skb 時,sk-》sk_wmem_alloc 都會遞增。正如我們所看到 的,UDP 數據報傳輸速度很快,通常不會在發送隊列中花費太多時間。

6. 總結

本文重點分析了數據包在傳輸層(UDP協議)的發送過程,并進行了監控和調優,后面數據包將到達 IP 協議層,下次再分享,感謝閱讀。

Reference:https://blog.packagecloud.io/eng/2017/02/06/monitoring-tuning-linux-networking-stack-sending-data

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • LINUX內核
    +關注

    關注

    1

    文章

    317

    瀏覽量

    22529

原文標題:Linux內核網絡udp數據包發送(二)——UDP協議層分析

文章出處:【微信號:gh_6fde77c41971,微信公眾號:FPGA干貨】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    LINUX內核網絡中的軟中斷KSOFTIRQD

    之前分享過Linux內核網絡數據包的接收過程,當執行到網卡通過硬件中斷(IRQ)通知CPU,告訴它有數據來了,CPU會根據中斷表,調用已經注冊的中斷函數,這個中斷函數會調到驅動程序(N
    發表于 12-15 11:44 ?2197次閱讀

    Linux系統收發網絡數據包的工作過程

    Linux 服務器收到網絡數據包,需要經過哪些處理,一步步將數據傳給應用進程的呢?應用進程發送
    發表于 06-08 12:34 ?704次閱讀
    <b class='flag-5'>Linux</b>系統收發<b class='flag-5'>網絡</b><b class='flag-5'>數據包</b>的工作過程

    Linux場景下數據包是如何在協議傳輸的

    所有互聯網服務,均依賴于TCP/IP協議棧。懂得數據是如何在協議棧傳輸的,將會幫助你提升互聯網程序的性能和解決TCP相關問題的能力。 我們講述Li
    的頭像 發表于 11-11 11:33 ?1666次閱讀
    <b class='flag-5'>Linux</b>場景下<b class='flag-5'>數據包</b>是如何在<b class='flag-5'>協議</b><b class='flag-5'>層</b>傳輸的

    DPDKAI驅動的高效數據包處理應用

    傳統的數據包處理方式是數據包先到內核最后再到用戶進行處理。這種方式會增加額外的延遲和CPU開銷
    的頭像 發表于 02-25 11:28 ?1712次閱讀
    DPDK<b class='flag-5'>在</b>AI驅動的高效<b class='flag-5'>數據包</b><b class='flag-5'>處理</b>應用

    Linux內核網絡的TCP傳輸控制塊相關資料分享

    1、Linux內核網絡之傳輸接收消息簡析傳輸發送消息時,TCP
    發表于 06-21 16:53

    Linux內核網絡網絡發送消息之IP分片簡析

    1、Linux內核網絡網絡發送消息之IP分片簡析本文分析下ip的分片。行 IP 分片。IP分片通常發生在
    發表于 07-20 15:34

    如何在沒有收到另一個udp數據包的情況下簡單地發送一個udp數據包

    \",\'data\')它在n“接收”塊 中完美運行,但我可以 找不到沒有收到另一個 udp 數據包的情況下簡單地發送一個 udp
    發表于 04-27 06:17

    UDP廣播數據包并不總是發送的原因?怎么處理

    UDP 作為廣播工作似乎是一個奇怪的問題: - 始終發送特定 IP 上發送UDP 數據包
    發表于 05-10 08:36

    UDP協議,UDP協議是什么意思

    UDP協議,UDP協議是什么意思 UDP 是User Datagram Protocol的簡稱, 中文名是用戶
    發表于 03-29 17:35 ?1563次閱讀

    數據包發送流程

    一個數據包,從聊天框里發出,消息會從聊天軟件所在的用戶空間拷貝到內核空間的發送緩沖區(send buffer),數據包就這樣順著傳輸
    的頭像 發表于 08-19 14:38 ?3060次閱讀

    有線網絡通信實驗2之UDP協議

    UDP協議是TCP/IP協議棧中傳輸協議,是一個簡單的面向數據報的
    的頭像 發表于 03-01 14:29 ?2889次閱讀
    有線<b class='flag-5'>網絡</b>通信實驗2之<b class='flag-5'>UDP</b><b class='flag-5'>協議</b>

    UDP協議原理詳解

    一個典型的使用UDP協議封裝的數據包,包括以太網MAC頭+網絡IP數據頭+傳輸
    的頭像 發表于 04-24 10:54 ?3276次閱讀
    <b class='flag-5'>UDP</b><b class='flag-5'>協議</b>原理詳解

    簡述Linux系統收發網絡數據包的過程

    Linux 服務器收到網絡數據包,需要經過哪些處理,一步步將數據傳給應用進程的呢?應用進程發送
    的頭像 發表于 05-05 10:04 ?925次閱讀
    簡述<b class='flag-5'>Linux</b>系統收發<b class='flag-5'>網絡</b><b class='flag-5'>數據包</b>的過程

    什么是UDP協議

    UDP協議即用戶數據報協議,該協議主要為應用程序提供了一種無需建立連接就可以發送封裝的 IP 數據包
    發表于 05-06 15:19 ?2773次閱讀

    Linux如何操作將數據包發送出去

    ? Linux 服務器收到網絡數據包,需要經過哪些處理,一步步將數據傳給應用進程的呢?應用進程發送
    的頭像 發表于 06-17 16:00 ?1587次閱讀
    <b class='flag-5'>Linux</b>如何操作將<b class='flag-5'>數據包</b><b class='flag-5'>發送</b>出去
    主站蜘蛛池模板: 一级特黄bbbbb免费观看 | 五月婷婷丁香网 | 亚洲乱码一区二区三区三上悠亚 | 国产激情一区二区三区 | 在线中文字幕一区 | 妖精色av无码国产在线看 | 色噜噜狠狠色综合网 | 91n成人| 白浆网站 | 好男人社区www在线官网 | 国产精自产拍久久久久久蜜小说 | 日韩免费黄色片 | 成人区精品一区二区婷婷 | 美女与动人物aa交性 | 黄色大网站 | 欧美大片网站 | 国产伦子系列沙发午睡 | 国产婷婷一区二区三区 | 国产精品久久国产精品 | 国产综合在线观看 | 在线播放少妇奶水过盛 | 91看片免费 | 国产高清免费在线观看 | 91精品国产视频 | 日韩在线网 | 国产办公室秘书无码精品99 | 免费在线观看污网站 | 中文在线中文a | 一区二区国产精品 | 中韩日产字幕2021 | 国产精品美女久久久久av超清 | 天天艹天天| 国产做受入口竹菊 | 天堂精品久久 | 永久免费精品精品永久-夜色 | 久久精热| 欧美精品一区三区 | 午夜乱码爽中文一区二区 | 国产japan18xxxxhd| 丰满少妇一区二区三区 | 欧美成人一区二区三区 | 亚洲精品久久久久久久不卡四虎 | 综合视频一区 | 娇喘顶撞深初h1v1 | 丰满少妇xbxb毛片日本视频 | 真人性生交免费视频 | 色站在线 | 成人18视频在线观看 | 黄网站永久免费 | 中国熟妇人妻xxxxx | 国产另类xxxx | 在线青草 | 无码日韩精品一区二区人妻 | 亚洲成av人片在线观看 | xxxx69黄大片| 国产精品免费一视频区二区三区 | 亚洲欧美在线播放 | 97色在线视频 | 天天摸天天碰 | 51久久成人国产精品麻豆 | 人与善性猛交xxxxx | 亚洲日韩视频 | 亚洲视频在线免费 | 在线色播 | 国产精品日韩一区 | 啪啪网页| 香港曰本韩国三级网站 | 欧美一级淫片免费视频魅影视频 | 国产国语农村妇女偷人视频 | 日韩精品极品视频在线 | 日本a级一区 | 在线 色| 日本少妇高潮喷水视频 | 国产成人无码国产亚洲 | 少妇一级淫片免费观看 | 欧洲国产视频 | 九一毛片| 最近日韩中文字幕中文 | 毛片免费全部无码播放 | 亚洲久悠悠色悠在线播放 | 亚洲乱码国产乱码精品精在线网站 | 在线成人播放 | 欧美自拍亚洲综合丝袜 | 成人午夜又粗又硬又大 | 中文字幕综合在线分类 | 少妇粉嫩小泬白浆流出 | 日本一区二区三区视频在线 | 国内精品久久久久久无码不卡 | 天堂资源最新在线 | 蜜桃精品一区二区 | 无码av免费一区二区三区 | 亚洲精品一区二区三区蜜臀 | 狠狠色综合欧美激情 | 亚洲午夜福利av一区二区无码 | 影音先锋男人天堂 | 少妇午夜三级伦理影院播放器 | 天天干夜夜拍 | 女人喂男人奶水做爰视频 | 欧美激情综合五月色丁香 | 精品亚洲一区二区三区在线观看 | 久久精品国产一区二区三区肥胖 | 国产视频在线播放 | 日本污污网站 | 久热国产视频 | 精品无码午夜福利理论片 | 欧美最猛黑人xxxx黑人猛交 | 亚洲风情av | 人妻少妇乱子伦精品无码专区电影 | 18禁美女裸身无遮挡免费网站 | 激情六月色 | 无套内谢孕妇毛片免费看看 | 大肉大捧一进一出好爽mba | 久久99久国产精品黄毛片入口 | 成人精品亚洲人成在线 | 国产精品久久久久久久一区探花 | 婷婷丁香六月天 | 美日韩免费视频 | 国产福利视频一区二区 | 99爱这里只有精品 | 嫩草视频在线观看 | 亚洲国产福利一区二区三区 | 国产在线精品一区二区中文 | 国产精品美女久久久久久久久 | 青草成人免费视频 | 极品女神爆呻吟啪啪 | 手机国产乱子伦精品视频 | 日韩欧美区 | 亚洲va欧美va国产综合先锋 | 黑人巨大xxxxx性猛交 | 91国偷自产一区二区三区 | 噜噜噜噜香蕉私人 | 成人免费无码av | 国产成人精品微拍视频网址 | 亚洲第一成人在线 | 最新国产精品久久精品 | 国产莉萝无码av在线播放 | 国产精品福利视频导航 | 国产乱国产乱 | 黄色免费在线网站 | 国产日韩在线播放 | 新婚之夜疯狂做爰视频一区二区 | 日韩美女乱淫aaa高清视频 | 日韩人成 | 1313午夜精品理论片 | 噜噜色av| 成年视频在线 | 色屁屁www影院免费观看入口 | 手机av网站 | 综合人妻久久一区二区精品 | 日本天堂在线 | 一本到不卡 | 中文字幕一区二区免费 | 风间由美不戴奶罩邻居勃起av | 美女av免费观看 | 国产精品 27p | 精品国产免费一区二区三区香蕉 | 五月天婷婷爱 | 国产精品jizz在线观看网站 | 成人av一区二区三区在线观看 | 欧美变态另类牲交 | 精品动漫3d一区二区三区免费版 | www毛片| 国产精品对白清晰受不了 | 五十老熟妇乱子伦免费观看 | 成人精品毛片 | 免费欧美黄色片 | 91女人18毛片水多国产 | 成人免费视频国产免费麻豆 | 嫩草在线视频 | 久久爱www久久做 | 欧美日本中文字幕 | 欧美色第一页 | 国产做爰xxxⅹ高潮 国产做爰xxxⅹ高潮69 | 正在播放国产精品 | 日韩一区二区三区在线免费观看 | 肉大捧一进一出免费视频 | 初尝黑人嗷嗷叫中文字幕 | 成人免费无码大片a毛片软件 | 狠狠五月婷婷 | 在线资源观看va | 亚洲男同视频网站 | 91久久偷偷做嫩草影院 | 成人免费一区二区 | 日本少妇在线观看 | 日本精品人妻无码免费大全 | 最新国产乱人伦偷精品免费网站 | 伊人久久青青草 | a级黄片毛片 | 97视频在线免费播放 | 欧洲精品在线观看 | √天堂资源在线中文最新版 | 中文人妻无码一区二区三区信息 | 免费又黄又裸乳的视频 | 美女又爽又黄网站视频 | 亚洲精品国产v片在线观看 亚洲精品国产成人 | 人与善性猛交xxxx视频 | 亚洲毛片av日韩av无码 | 91桃色在线 | 久久精品国产精品亚洲精品 | 91国产丝袜在线 | 精品国产一区二区三区不卡蜜臂 | 免费网站成人 | 欧美国产精品一二三 | 少妇邻居内射在线 | 曰本不卡视频 | 91久久精品一区二区三区大 | 真人抽搐一进一出视频 | 性乡下性大开放 | 深爱激情综合网 | 黄色大片免费的 | 亚洲综合无码无在线观看 | 超碰8| 巨人精品福利官方导航 | 国产偷倩视频 | 日韩在线aⅴ免费视频 | 人善交video另类hd侏儒 | 夜夜欢性恔免费视频 | 欧美一级片在线播放 | 久久久www成人免费无遮挡大片 | 性生活网址 | 日韩中文字幕免费视频 | 免费网站看sm调教视频 | 免费观看午夜视频 | 国产成人av一区二区三区 | 国产人妻久久精品二区三区老狼 | 免费在线观看污网站 | jizz高清| 中文字幕无人区二 | 欧美精品一二 | 大尺度无遮挡激烈床震网站 | 黄色a视频| 中字幕视频在线永久在线观看免费 | 激情综合视频 | av女优天堂在线观看 | 小早川怜子xxxxaⅴ在线 | 欧美日韩色另类综合 | 无码av中文一区二区三区桃花岛 | 国产精品丝袜 | 国产精品一二三区成毛片视频 | 91精品久久久久久久91蜜桃 | 纤纤影视理伦片在线看 | 在线a亚洲视频播放在线观看 | 丰满少妇猛烈进入三区视频 | 欧美极品少妇xxxxⅹ喷水 | 动漫卡通精品一区二区三区介绍 | 国产刺激的三3p交换视频 | 麻豆出品 | 亚洲一级在线 | 风流老熟女一区二区三区 | 国产大学生呻吟对白精彩在线 | 99视频在线精品 | 九九色在线观看 | 婷婷国产在线 | 久色视频在线 | 谁有av网址| 偷拍激情视频一区二区三区 | 中文在线字幕观 | 午夜影院体验区 | 老子午夜精品无码 | 成人免费看片又大又黄 | 亚洲欧美日韩愉拍自拍 | 九色porny丨精品自拍视频 | 97久久国产亚洲精品超碰热 | 国产 一二三四五六 | 亚洲成人不卡 | 日本一级淫片免费啪啪3 | 亚欧色视频 | 三级三级久久三级久久18 | 999视频在线播放 | 免费毛片网站在线观看 | 韩日在线视频观看 | 黄色录像一级大片 | 熟妇人妻无码xxx视频 | 日韩av片无码一区二区不卡电影 | 全部免费毛片在线播放一个 | 国内精品一区二区三区 | av高清在线 | 国产精品永久免费观看 | jav久久亚洲欧美精品 | 久久精品亚洲天堂 | 国产精品婷婷久久爽一下 | 国产精品久久久久9999 | 刘亦菲三级床视频大全 | 国产综合久久久久 | 无码av波多野结衣久久 | 免费看片网站91 | 小柔的淫辱日记(1~7) | 日本精品一区二区三区在线观看 | 久久人妻无码一区二区 | 久久久久爱 | 久久精品视频观看 | 少妇无码太爽了不卡视频在线看 | 国产三级一区二区三区 | 久久久久久久美女 | 奴性白洁会所调教 | 51精品久久久久久久蜜臀 | 亚洲国产成人精品无码区在线观看 | 文中字幕一区二区三区视频播放 | 性色av无码不卡中文字幕 | 色综合88| 日日碰狠狠躁久久躁综合小说 | 日日操夜夜爱 | 亚洲国产精久久久久久久 | 国产人伦激情在线观看 | 99国产精品99久久久久久娜娜 | 国产精品日本一区二区在线播放 | 亚洲网站在线播放 | 99re在线观看视频 | 91午夜在线 | 免费无码黄动漫在线观看 | 亚洲国产成人欧美激情 | 欧美一a一片一级一片 | 国产精品久久久久久久久岛 | 一级一级特黄女人精品毛片 | 精品国产亚洲第一区二区三区 | 老司机67194精品线观看 | 国产诱惑av | 欧美综合社区 | 国产一区二区四区 | 麻豆久久久9性大片 | 国产视频一二三四区 | 欧美性xxxx极品hd欧美风情 | www.欧美色图 | 2018天天躁夜夜躁 | 阿v天堂2017 阿v天堂2018 | 欧美性猛交富婆 | 欧美成人精品 | 98精品国产 | 色婷婷狠| 国产一区二区午夜 | 精品 日韩 国产 欧美 视频 | 午夜剧场大片亚洲欧洲一区 | 人成在线免费视频 | 国产tscd人妖同性另类调教 | 中文 在线 日韩 亚洲 欧美 | 人人干免费 | 丰满岳乱妇一区二区三区 | 男人靠女人免费视频网站 | 日韩久久精品一区二区三区 | 精品无码av一区二区三区 | 羞羞国产一区二区三区四区 | 东日韩二三区 | 国产精品区在线观看 | 国产视频在线一区二区 | 4438xx亚洲五月最大丁香 | 欧美日韩新片 | 国产乱码精品一区二区三区中文 | 校园伸入裙底揉捏1v1h | 日本美女黄色大片 | 红桃色av | 欧美最猛黑人xxxx黑人猛交98 | 污污的视频在线免费观看 | 毛片高清免费 | 少妇做爰免费视频网站www | 欧美内射rape视频 | 中文字幕一区二区三区精华液 | 成人必看www | 97精品伊人久久久大香线蕉97如何观看 | 天天综合影院 | 男同志毛片特黄毛片 | 少妇人妻无码专区在线视频 | 亚州av网| 91久久久久国产一区二区 | 99精品免费久久久久久久久 | 欧美三级在线 | 日韩第2页| 国产色婷婷亚洲99精品小说 | 老司机在线精品视频网站的优点 | 插鸡网站在线播放免费观看 | 少妇又色又紧又爽又刺激视频 | 久久中文字幕无码专区 | 日韩欧美中文字幕在线观看 | 五月天精品一区二区三区 | 人摸人人人澡人人超碰97 | 99久久这里只有精品 | 都市激情 在线 亚洲 国产 | 特级西西人体444www高清 | 中文无码精品a∨在线观看不卡 | h片免费在线观看 | 国产成人免费一区二区60岁 | 日韩av有码 | 日本www色 | 欧美精品啪啪 | 久久免费在线观看 | 亚洲 小说 欧美 激情 另类 | 成人看片黄a免费看视频 | 欧美日韩中文字幕一区 | 国产传媒资源网站 | 麻豆欧美 | 日本男人天堂网 | 调教一区二区三区 | 人人妻一区二区三区 | 成人国产精品免费观看视频 | 国产中文在线 | 嫩b人妻精品一区二区三区 色噜噜亚洲男人的天堂 | 亚洲熟妇无码爱v在线观看 又色又爽又黄18禁美女裸身无遮挡 | 无码午夜成人1000部免费视频 | 日本亲近相奷中文字幕 | 青青青爽视频在线观看 | 亚洲性少妇性猛交wwww乱大交 | 欧美激情免费看 | 色噜噜狠狠狠狠色综合久一 | 国产日产欧产美韩系列麻豆 | 欧美在线免费视频 | 欧美一区精品 | 亚洲成人精品在线观看 | 一本大道伊人av久久乱码 | 天天操天天舔天天干 | 免费无码av片在线观看 | 熟女内射v888av | 亚洲免费黄色网 | 亚洲精品乱码久久久久久不卡 | 精品国产一区二区三区四区在线 | 一区二区三区网站 | www久久精品 | 久草在线中文视频 | 精品久久久久久久久久国产潘金莲 | 骚五月 | 亚洲精品久久久久999中文字幕 | 国产微拍精品一区 | 成人18视频免费69 | 久久国产36精品色熟妇 | 中文字幕超清在线免费 | 久久99精品久久久秒播软件优势 | 久久精品一本到东京热 | 国产美女精品视频免费播放软件 | 国产精品免费入口 | 男人天堂网在线视频 | av私库在线观看 | 国产丝袜一区二区三区免费视频 | 色网站免费在线观看 | 国产69精品一区二区亚洲孕妇 | 日韩不卡毛片 | 精品一区二区三区四区五区六区 | 草草影院精品一区二区三区 | 夜夜操天天干 | 97中文字幕 | va婷婷| 国产日韩欧美一区二区东京热 | 高清中文字幕 | 欧美三级日本三级 | 韩国精品一区二区三区无码视频 | 茄子av在线 | 欧美大片va欧美在线播放 | 强行从后面挺进人妻 | 喷水白丝蜜臀av久久av | 国产精品久久久久久久久动漫 | 最近中文字幕2019视频1 | 天天插伊人 | 日本一区二区三区免费看 | 五月激情在线 | 在线观看国产一区二区 | zzijzzij日本丰满少妇 | 国产高清日韩 | 亚洲嫩草影院 | 国产人妖ts重口系列喝尿视频 | 精品国产色 | 国产精品毛片va一区二区三区 | 亚洲精品美女久久久久久久 | 性欧美视频在线观看 | 日韩午夜视频在线 | 久久伊人热 | 午夜福利理论片高清在线 | 欧美日韩在线视频一区二区 | 95av成人女人啪啪 | 青娱乐最新地址 | 国产美女91呻吟求 | 69久久精品 | 奇米第四色一二三四区 | 中文字幕av一区二区三区 | 国产欧美日韩精品a在线观看 | 黄色一大片 | 操少妇视频 | 天天色综合久久 | 国产性自拍 | 日本成熟老妇乱 | 18精品久久久无码午夜福利 | 丁香六月啪啪 | 中文字幕久久网 | 亚洲一区二区三区无码久久 | 激情av综合 | 国产在线精品播放 | 亚洲午夜视频 | a∨在线观看 | 亚洲欧洲激情 | 亚洲成人av网址 | xxav在线| 亚洲欧洲日产国码无码久久99 | 四虎国产精品永久在线国在线 | 黄色中文字幕 | 精品一二三 | 中文字幕亚洲精品久久女人 | 亚洲一区二区三区四区五区中文 | 人妻aⅴ无码一区二区三区 日本一卡2卡3卡四卡精品网站 | 欧美视频在线观看免费 | 亚洲mv高清砖码区2022伊甸园 | 天天狠狠色噜噜 | 又大又长粗又爽又黄少妇视频 | 狠狠色婷婷久久综合频道毛片 | 无遮挡边吃摸边吃奶边做 | 乱h高h翁欲渴 | 又色又污又爽又黄的网站 | 欧美人伦禁忌dvd放荡欲情 | 任你躁国产自任一区二区三区 | 国产精品久久伊人 | 国产精品99久久久久久久久 | 拧花蒂尿用力按凸起喷水尿一区 | 欧美v日本 | 日韩性xxx| 一本久久a久久精品综合 | 高h捆绑拘束调教小说 | 中文乱码人妻系列一区二区 | 插吧插吧综合网 | 狂野欧美性猛交免费视频 | 无码专区人妻系列日韩 | 日日噜噜噜噜夜夜爽亚洲精品 | 日韩精品一区二区在线 | 国产淫语对白粗口video | 色综合久久88色综合天天6 | 中国少妇的呻吟xvideos | 国产精品第9页 | 欧美激情视频在线 | 一区一区三区四区产品动漫 | 久久久国产精品黄毛片 | 在线免费观看视频a | 日韩激情av | 国产一在线精品一区在线观看 | 韩漫动漫免费大全在线观看 | 黄色一级大片免费看 | 日本精品网站 | 久久久精品一区二区 | 调教大乳女仆喷奶水 | 麻豆人妻无码性色av专区 | 欧美日一区二区三区 | 姑娘第5集高清在线观看 | 欧美国产一区二区三区 | 欧美黄色网 | 国产婷婷色综合av蜜臀av | 久久国产精品久久精品国产 | 少妇又紧又色又爽又黄又刺激 | 国产精品久久久久久久久久辛辛 | 久久久av一区二区三区 | 免费观看a级片 | 日本少妇激三级做爰在线 | 噜噜噜狠狠夜夜躁精品仙踪林 | 国产成人综合久久久久久 | 亚洲国产一区二区a毛片 | 三级五月天 | a级片免费在线观看 | 国精品午夜福利视频不卡 | 在线看污片 | 国产人伦精品一区二区三区 | 91爱看| 色射影院| 夜夜操夜夜摸 | jizzzz成熟丰满韩国女视频 | 中文字幕在线观看英文怎么写 | 久久久91视频 | 精品国产影院 | 国产三级在线看 | 久久99日韩国产精品久久99 | 日韩美女乱淫免费看视频大黄 | 成人免费网站在线观看 | 久久久九九 | 中文字幕在线播出 | 欧美日韩乱国产 | 妖精视频一区二区三区 | 亚洲国产成人无码av在线 | 加勒比无码人妻东京热 | 欧美在线观看视频免费 | 99精品久久99久久久久 | 精品一区二区在线视频 | 欧美成视频人免费淫片 | 97超碰人人澡 | 99热这里只有精品在线 | 亚洲第一页中文字幕 | 国产精品亚州 | 国产精品伦子伦免费视频 | 性色影院 | 美女午夜激情 | xxxx日本少妇 | 捆绑凌虐一区二区三区 | 久久精品国产日本波多野结衣 | 激情五月综合色婷婷一区二区 | 亚洲最新中文字幕在线 | ass精品国模裸体pics | 婷婷四房综合激情五月 | 亚洲911精品成人18网站 | 337p粉嫩大胆噜噜噜亚瑟影院 | 桃色视频m3u8 | 亚洲精品高潮 | 精品人体无码一区二区三区 | 综合天堂av久久久久久久 | 欧美黄色特级视频 | 久久深夜视频 | 91亚洲乱码卡一卡二卡新区豆 | 一道本一区| 国产乱色国产精品播放视频 | 中国精品妇女性猛交bbw | 免费黄在线 | 欧美大成色www永久网站婷 | 五月综合激情 | 国产成人av免费观看 | 成人网色 | 欧美一区二区三区喷汁尤物 | av资源一区| 日本免费a级片 | 亚洲国产人午在线一二区 | 91在线视频播放 | 翁虹三级做爰在线播放 | 制服丝袜亚洲中文综合懂色 | 91精品国产综合久 | 一区二区三区在线看 | 亚洲男人天堂 | 好男人社区资源 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品