国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

深入理解Linux網(wǎng)絡(luò)——本機網(wǎng)絡(luò)IO

這篇具有很好參考價值的文章主要介紹了深入理解Linux網(wǎng)絡(luò)——本機網(wǎng)絡(luò)IO。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

系列文章:

  1. 深入理解Linux網(wǎng)絡(luò)——內(nèi)核是如何接收到網(wǎng)絡(luò)包的
  2. 深入理解Linux網(wǎng)絡(luò)——內(nèi)核與用戶進程協(xié)作之同步阻塞方案(BIO)
  3. 深入理解Linux網(wǎng)絡(luò)——內(nèi)核與用戶進程協(xié)作之多路復(fù)用方案(epoll)
  4. 深入理解Linux網(wǎng)絡(luò)——內(nèi)核是如何發(fā)送網(wǎng)絡(luò)包的
  5. 深入理解Linux網(wǎng)絡(luò)——本機網(wǎng)絡(luò)IO
  6. 深入理解Linux網(wǎng)絡(luò)——TCP連接建立過程(三次握手源碼詳解)
  7. 深入理解Linux網(wǎng)絡(luò)——TCP連接的開銷

前面的章節(jié)深度分析了網(wǎng)絡(luò)包的接收,也拆分了網(wǎng)絡(luò)包的發(fā)送,總之收發(fā)流程算是閉環(huán)了。不過還有一種特殊的情況沒有討論,那就是接收和發(fā)送都在本機進行。而且實踐中這種本機網(wǎng)絡(luò)IO出現(xiàn)的場景還不少,而且還有越來越多的趨勢。例如LNMP技術(shù)棧中的nginx和php-fpm進程就是通過本機來通信的,還有流行的微服務(wù)中sidecar模式也是本機網(wǎng)絡(luò)IO。

一、相關(guān)實際問題

  1. 127.0.0.1本機網(wǎng)絡(luò)IO需要經(jīng)過網(wǎng)卡嗎
  2. 數(shù)據(jù)包在內(nèi)核中是什么走向,和外網(wǎng)發(fā)送相比流程上有什么差別
  3. 訪問本機服務(wù)時,使用127.0.0.1能比本機IP(例如192.168.x.x)快嗎

二、跨機網(wǎng)絡(luò)通信過程

在開始講述本機通信過程之前,先回顧前面的跨機網(wǎng)絡(luò)通信。

1)跨機數(shù)據(jù)發(fā)送

  1. 應(yīng)用層:send/sendto

  2. 系統(tǒng)調(diào)用:(send=>)sendto

    1. 構(gòu)造msghdr并賦值(用戶待發(fā)送數(shù)據(jù)的指針、數(shù)據(jù)長度、發(fā)送標志等)
    2. sock_sendmsg => __sock_sendmsg_nosec => sock->ops->sendmsg
  3. 協(xié)議棧:inet_sendmsg(AF_INET協(xié)議族對socck->ops->sendmsg的實現(xiàn))

    • 傳輸層

      1. sk->sk_prot->sendmsg
      2. tcp_sendmsg(tcp協(xié)議對sk->sk_prot->sendmsg的實現(xiàn)):數(shù)據(jù)拷貝到發(fā)送隊列的skb
      3. tcp_write_xmit:擁塞控制、滑動窗口、包分段
      4. tcp_transmit_skb:拷貝skb、封裝TCP頭、調(diào)用網(wǎng)絡(luò)層發(fā)送
    • 網(wǎng)絡(luò)層

      1. ip_queue_xmit:查找socket緩存的路由表,沒有則查找路由項并緩存,為skb設(shè)置路由表,封裝IP頭并發(fā)送
      2. ip_local_out => __ip_local_out => nf_hook:netfilter過濾
      3. skb_dst(skb)->output(skb):找到skb路由表的dst條目,調(diào)用output方法
      4. ip_output:簡單的統(tǒng)計,再次執(zhí)行netfilter過濾,回調(diào)ip_finish_output
      5. ip_finish_output:校驗數(shù)據(jù)包的長度,如果大于MTU,就會執(zhí)行分片
      6. ip_finish_output2:調(diào)用鄰居子系統(tǒng)定義的方法
  4. 鄰居子系統(tǒng)

    1. rt_nexthop:獲取路由下一跳的IP信息

    2. __ipv4_neigh_lookup_noref:根據(jù)下一條IP信息在arp緩存中查找鄰居項

    3. __neigh_create:創(chuàng)建一個鄰居項,并加入鄰居哈希表

    4. dst_neigh_output => neighbour->output(實際指向neigh_resolve_output):

      1. 封裝MAC頭(可能會先觸發(fā)arp請求)
      2. 調(diào)用dev_queue_xmit發(fā)送到下層
  5. 網(wǎng)絡(luò)設(shè)備子系統(tǒng)

    1. dev_queue_xmit:選擇發(fā)送隊列,獲得排隊規(guī)則,存在隊列則調(diào)用__dev_xmit_skb
    2. __dev_xmit_skb:根據(jù)qdisc狀態(tài)執(zhí)行不同邏輯
    3. q->enqueue:入隊
    4. __qdisc_run:開始發(fā)送
    5. qdisc_restart ?=> sch_direct_xmit => dev_hard_start_xmit從隊列取出一個skb并發(fā)送
    6. dev->netdev_ops->ndo_start_xmit:調(diào)用驅(qū)動里的發(fā)送回調(diào)函數(shù),將數(shù)據(jù)包傳給網(wǎng)卡設(shè)備
  6. 驅(qū)動程序:igb_xmit_frame

    1. igb_xmit_frame_ring:獲取發(fā)送環(huán)形數(shù)組隊列下一個可用的緩沖區(qū),掛上skb
    2. igb_tx_map:獲取下一個描述符指針,將skb數(shù)據(jù)映射到網(wǎng)卡可訪問的內(nèi)存DMA區(qū)域
  7. 硬件發(fā)送

    1. 發(fā)送完畢觸發(fā)硬中斷通知CPU
    2. igb_msix_ring => napi_schedule => __raise_softirq_irqoff:硬中斷處理,發(fā)起軟中斷
    3. net_rx_action => igb_poll:軟中斷處理
    4. igb_clean_tx_irq:釋放skb,清除tx_buffer,清理DMA

2)跨機數(shù)據(jù)接收

  1. 硬件

    1. 網(wǎng)卡把幀DMA到內(nèi)存
    2. 發(fā)起硬中斷通知CPU
  2. 驅(qū)動程序

    1. igb_msix_ring => napi_schedule => __raise_softirq_irqoff:硬中斷處理,發(fā)起軟中斷
    2. net_rx_action => igb_poll:軟中斷處理
    3. igb_clean_rx_irq:從RingBuffer取出數(shù)據(jù)包進行初步處理、檢查完整性等,并將其封裝為sk_buff添加到網(wǎng)絡(luò)接收隊列
  3. 網(wǎng)絡(luò)設(shè)備子系統(tǒng):netif_receive_skb

    1. __netif_receive_skb_core:遍歷ptype_all鏈表處理數(shù)據(jù)包(tcp_dump抓包點),遍歷ptype_base哈希表處理數(shù)據(jù)包
    2. deliver_skb:根據(jù)上述遍歷到的協(xié)議,傳遞給對應(yīng)協(xié)議處理函數(shù)進行進一步的處理。例如IP數(shù)據(jù)包(ptype_base中)則將其傳遞給IP協(xié)議處理模塊。
  4. 網(wǎng)絡(luò)協(xié)議棧處理:pt_prev->func

    • 網(wǎng)絡(luò)層

      1. ip_rcv:通過Netfilter進行進一步處理,比如網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)、防火墻過濾等操作
      2. ip_rcv_finish => ip_local_deliver_finish:使用inet_protos拿到協(xié)議的函數(shù)地址,根據(jù)包中的協(xié)議類型選擇分發(fā)。在這里skb包將會進一步被派送到更上層的協(xié)議中,UDP或TCP
    • 傳輸層

      1. tcp_v4_rcv:獲取tcp頭和ip頭,拿到目的ip地址和端口,找到對應(yīng)的socket
      2. tcp_v4_do_rcv => tcp_rcv_established:將接收到的數(shù)據(jù)放到socket的接收隊列尾部,并調(diào)用sk_data_ready來喚醒在socket上等待的用戶進程
      3. sock_def_readable =>autoremove_wake_function => default_wake_function:喚醒進程
  5. 用戶進程

    1. 系統(tǒng)調(diào)用recv => sock_recvmsg ==> __sock_recvmsg ==> __sock_recvmsg_nosec
    2. sock->ops->recvmsg:在AF_INET中其指向的是inet_recvmsg
    3. inet_recvmsg => sk->sk_prot->recvmsg:在SOCK_STREAM中它的實現(xiàn)是tcp_recvmsg
    4. tcp_recvmsg:遍歷接收隊列,如果數(shù)據(jù)量不滿足則阻塞進程
    5. sk_wait_data:定義了一個等待隊列項wait,在這個新的等待隊列項上注冊了回調(diào)函數(shù)autoremove_wake_function,并把當前進程描述符current關(guān)聯(lián)到其.private成員上,讓出cpu進入睡眠
    6. 睡眠===
    7. 喚醒后繼續(xù)遍歷隊列接收數(shù)據(jù)

3)跨機網(wǎng)絡(luò)通信匯總

深入理解Linux網(wǎng)絡(luò)——本機網(wǎng)絡(luò)IO,網(wǎng)絡(luò),linux,網(wǎng)絡(luò),tcp/ip,io

三、本機發(fā)送過程

上面主要介紹了跨機時整個網(wǎng)絡(luò)的發(fā)送過程, 而在本機網(wǎng)絡(luò)IO過程中,會有一些差別。主要的差異有兩部分,分別是路由和驅(qū)動程序。

1)網(wǎng)絡(luò)層路由

發(fā)送數(shù)據(jù)進入?yún)f(xié)議棧到達網(wǎng)絡(luò)層的時候,網(wǎng)絡(luò)層入口函數(shù)是ip_queue_xmit。在網(wǎng)絡(luò)層里會進行路由選擇,路由選擇完畢再設(shè)置一些IP頭,進行一些Netfilter的過濾,數(shù)據(jù)包分片等操作,然后將包交給鄰居子系統(tǒng)。

對于本機網(wǎng)絡(luò)IO來說,特殊之處在于在local路由表中就可以找到路由項,對應(yīng)的設(shè)備都是用loopback網(wǎng)卡,也就是常說的lo設(shè)備。

我們重新回到之前網(wǎng)絡(luò)層查找路由項的部分代碼:

int ip_queue_xmit(struct sk_buff *skb, struct flowi *fl)
{
    // 檢查socket中是否有緩存的路由表
    rt = (struct rtable*)__sk_dst_check(sk, 0);
    ......
    if(rt == null) {
  	// 沒有緩存則展開查找路由項并緩存到socket中
	rt = ip_route_output_ports(...);
 	sk_setup_caps(sk, &rt->dst);
    }
}

查找路由項的函數(shù)時ip_route_output_ports,它經(jīng)過層層調(diào)用,來到關(guān)鍵的部分——fib_lookup

static inline int fib_lookup(struct net *net, const struct flowi4 *flp, struct fib_result *res)
{
    struct fib_table *table;
    table = fib_get_table(net, RT_TABLE_LOCAL);
    if(!fib_table_lookup(table, flp, res, FIB_LOOKUP_NOREF))
    // 查找與給定流(由flp指定)匹配的路由項,并將查找結(jié)果存儲在res中。FIB_LOOKUP_NOREF是傳遞給此函數(shù)的標志,用于指定查找行為的一些細節(jié)。
    // 查找成功返回0
	return 0;
    table = fib_get_table(net, RT_TABLE_MAIN);
    if(!fib_table_lookup(table, flp, res, FIB_LOOKUP_NOREF))
	return 0;
    return -ENETUNREACH;
}

在fib_lookup中將會對local和main兩個路由表展開查詢,并且先查詢local后查詢main。我們在Linux上使用ip命令可以查看到這兩個路由表,這里只看local路由表(因為本機網(wǎng)絡(luò)IO查詢到整個表就結(jié)束了)

#ip route list table local
local 10.143.x.y dev eth0 proto kernel scope host src 10.143.x.y
local 127.0.0.1 dev lo proto kernel host src 127.0.0.1

從上述結(jié)果可以看出127.0.0.1的路由在local路由表中就能夠找到。

上面路由表中10.143.x.y dev eth0是本機的局域網(wǎng)IP,雖然寫的是dev eth0,但是其實內(nèi)核在初始化local路由表的時候,把local路由表里所有的路由項都設(shè)置為了RTN_LOCAL。所以即使本機IP不用環(huán)回地址,內(nèi)核在路由項查找的時候判斷類型是RTN_LOCAL,仍然會使用net->loopback_dev,也就是lo虛擬網(wǎng)卡。

此處可以使用tcpdump -i eht0 port 8888以及telnet 10.143.x.y 8888進行驗證,telnet后tcpdump并不會收到網(wǎng)絡(luò)請求,因為發(fā)給的是lo。

之后fib_lookup的工作完成,返回上一層__ip_route_output_key函數(shù)繼續(xù)執(zhí)行。

struct rtable *ip_route_output_key(struct net *net, struct flowi4 *fl4)
{
    if(fib_lookup(net, fl4, &res) {
    }
    if(res.type == RTN_LOCAL) {
  	dev_out = net->loopback_dev;
        ......  
    }
    ......
}

對于本機的網(wǎng)絡(luò)請求,設(shè)備將全部使用net->loopback_dev,也就是lo虛擬網(wǎng)卡。接下來的網(wǎng)絡(luò)層仍然和跨機網(wǎng)絡(luò)IO一樣(所以本機網(wǎng)絡(luò)IO如果skb大于MTU仍然會進行分片,不過lo虛擬網(wǎng)卡(65535)的MTU(1500)比Ethernet大得多),最終會經(jīng)過ip_finish_output,進入鄰居子系統(tǒng)的入口函數(shù)dst_neigh_output。

在鄰居子系統(tǒng)函數(shù)中經(jīng)過處理后,進入網(wǎng)絡(luò)設(shè)備子系統(tǒng)(入口函數(shù)是dev_queue_xmit)

2)網(wǎng)絡(luò)設(shè)備子系統(tǒng)

網(wǎng)絡(luò)設(shè)備子系統(tǒng)的入口函數(shù)是dev_queue_xmit,其中會判斷是否有隊列對于有隊列的物理設(shè)備,該函數(shù)進行了一系列復(fù)雜的排隊等處理后,才調(diào)用dev_hard_start_xmit,從這個函數(shù)在進入驅(qū)動程序igb_xmit_frame來發(fā)送。在這個過程中還可能觸發(fā)軟中斷進行發(fā)送。

但是對于啟動狀態(tài)的回環(huán)設(shè)備(q->enqueue判斷為false)來說就簡單多了,它沒有隊列的問題,直接進入dev_hard_start_xmit

int dev_queue_xmit(struct sk_buff *skb)
{
    q = rcu_dereference_bh(txq_qdisc);
    if(q->enqueue) { // 回環(huán)設(shè)備這里返回false
  	rc = __dev_xmit_skb(skb, q, dev, txq);
   	goto out;
    }
    // 開始回環(huán)設(shè)備處理
    if(dev->flags & IFF_UP) {
	dev_hard_start_xmit(skb, dev, txq, ...);
	......
    }
}

在dev_hard_start_xmit函數(shù)中還將調(diào)用設(shè)備驅(qū)動的操作函數(shù),對于回環(huán)設(shè)備的而言,其“設(shè)備驅(qū)動”的操作函數(shù)ops->ndo_start_xmit指向的是loopback_xmit(不同于正常網(wǎng)絡(luò)設(shè)備的igb_xmit_frame)。

3)驅(qū)動程序

static netdev_tx_t loopback_xmit(struct sk_buff *skb, struct net_device *dev)
{
    // 剝離掉和源socket的聯(lián)系
    skb_orphan(skb);
    // 調(diào)用netif_rx
    if(likely(netif_rx(skb) == NET_RX_SUCCESS) {}
}

loopback_xmit中首先調(diào)用skb_orphan先把skb上的socket指針去掉了,接著調(diào)用netif_tx,在該方法中最終會執(zhí)行到enqueue_to_backlog。

在本機IO發(fā)送的過程中,傳輸層下面的skb就不需要釋放了,直接給接收方傳過去就行。不過傳輸層的skb就節(jié)約不了,還是需要頻繁地申請和釋放。

static int enqueue_to_backlog(struct sk_buff *skb, int cpu, unsigned int *qtail)
{
    sd = &per_cpu(softnet_data, cpu);
    ......
    __skb_queue_tail(&sd->input_pkt_queue, skb);
    ......
    __napi_schedule(sd, &sd->backlog);
}

enqueue_to_backlog函數(shù)用于把要發(fā)送的skb插入softnet_data->input_pkt_queue隊列

具體步驟如下:

  1. sd = &per_cpu(softnet_data, cpu):獲取給定 CPU 的softnet_data結(jié)構(gòu)。這個結(jié)構(gòu)保存了這個 CPU 的一些網(wǎng)絡(luò)處理狀態(tài)和數(shù)據(jù),比如input_pkt_queue。
  2. __skb_queue_tail(&sd->input_pkt_queue, skb):將數(shù)據(jù)包skb加入到input_pkt_queue隊列的尾部。
  3. __napi_schedule(sd, &sd->backlog):調(diào)度該函數(shù)來觸發(fā)軟中斷處理這個隊列。

這里觸發(fā)的軟中斷類型是NET_RX_SOFTIRQ,只有觸發(fā)完軟中斷,發(fā)送過程才算完成了。

四、本機接收過程

發(fā)送過程觸發(fā)軟中斷后,會進入軟中斷處理函數(shù)net_rx_action。

在跨機地網(wǎng)絡(luò)包地接收過程中,需要經(jīng)過硬中斷,然后才能觸發(fā)軟中斷。而在本機地網(wǎng)絡(luò)IO過程中,由于并不真的過網(wǎng)卡,所以網(wǎng)卡地發(fā)送過程、硬中斷就都省去了,直接從軟中斷開始。

對于igb網(wǎng)卡來說,軟中斷中輪詢調(diào)用的poll函數(shù)指向的是igb_poll函數(shù)。而對于loopback網(wǎng)卡來說,poll函數(shù)是process_backlog。

static int process_backlog(struct napi_struct *napi, int quota)
{
    while() {
    	while((skb = __skb_dequeue(&sd->process_queue)) {
	    __netif_receive_skb(skb);
 	}
 	// skb_queue_splice_tail_init()函數(shù)用來將鏈表a(輸入隊列)的元素鏈接到鏈表b(處理隊列)上
 	// 形成一個新的鏈表b,并將原來a的頭變成了空鏈表
 	qlen = skb_queue_len(&sd->input_pkt_queue);
	if(qlen)
	    skb_queue_splice_tail_init(&sd->input_pkt_queue, &sd->process_queue);
	}
    }
}

這個函數(shù)用于反復(fù)處理隊列中的數(shù)據(jù)包,直到隊列為空或者處理的數(shù)據(jù)包數(shù)量達到了指定的配額(quota)。

在內(nèi)層循環(huán)中,它使用 __skb_dequeue() 函數(shù)從 process_queue 中取出一個數(shù)據(jù)包,然后使用 __netif_receive_skb() 函數(shù)處理這個數(shù)據(jù)包

在內(nèi)層循環(huán)結(jié)束后,它檢查 input_pkt_queue(輸入數(shù)據(jù)包隊列)是否還有剩余的數(shù)據(jù)包。如果有,它使用 skb_queue_splice_tail_init() 函數(shù)將 input_pkt_queue 中的數(shù)據(jù)包移動到 process_queue 中,然后在下一次內(nèi)層循環(huán)中繼續(xù)處理這些數(shù)據(jù)包。

__netif_receive_skb用于將數(shù)據(jù)送往協(xié)議棧,在此之后的調(diào)用過程就和跨機網(wǎng)絡(luò)的IO又一致了:__netif_receive_skb => __netif_receive_skb_core => deliver_skb,然后再將數(shù)據(jù)送入ip_rcv中進行后續(xù)操作。

五、問題解答

  1. 127.0.0.1本機網(wǎng)絡(luò)IO需要經(jīng)過網(wǎng)卡嗎

    • 不需要經(jīng)過網(wǎng)卡,即使網(wǎng)卡拔了也可以正常使用本機網(wǎng)絡(luò)
  2. 數(shù)據(jù)包在內(nèi)核中是什么走向,和外網(wǎng)發(fā)送相比流程上有什么差別

    • 節(jié)約了驅(qū)動上的一些開銷。發(fā)送數(shù)據(jù)不需要靜茹RingBuffer的驅(qū)動隊列,直接把skb傳給接收協(xié)議棧。
    • 其他組件,包括系統(tǒng)調(diào)用、協(xié)議棧、設(shè)備子系統(tǒng)都經(jīng)過了,甚至驅(qū)動程序也運行了,所以還是有一定的開銷的。
    • 如果想要再本機網(wǎng)絡(luò)IO上繞開協(xié)議棧的開銷,可以動用eBPF,用eBPF的sockmap和sk redirect可以達到真正不走協(xié)議棧的目的。
  3. 訪問本機服務(wù)時,使用127.0.0.1能比本機IP(例如192.168.x.x)快嗎

    • 本機IP和127.0.0.1沒有差別,都是走的環(huán)回設(shè)備lo
    • 這是因為內(nèi)核在設(shè)置IP的時候,把所有的本機IP都初始化到了local路由表里,類型寫死了是RTN_LOCAL。所以后面的路由項選擇的時候發(fā)現(xiàn)類型是RTN_LOCAL就會選擇lo設(shè)備。

參考資料:

《深入理解Linux網(wǎng)絡(luò)》—— 張彥飛文章來源地址http://www.zghlxwxcb.cn/news/detail-553789.html

到了這里,關(guān)于深入理解Linux網(wǎng)絡(luò)——本機網(wǎng)絡(luò)IO的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Linux基礎(chǔ)IO【文件理解與操作】

    Linux基礎(chǔ)IO【文件理解與操作】

    ?個人主頁: Yohifo ??所屬專欄: Linux學(xué)習(xí)之旅 ??每篇一句: 圖片來源 ??操作環(huán)境: CentOS 7.6 阿里云遠程服務(wù)器 Great minds discuss ideas. Average minds discuss events. Small minds discuss people. 大智論道,中智論事,小智論人。 文件操作是 基礎(chǔ)IO 學(xué)習(xí)的第一步,我們在 C語言 進階中,就

    2024年02月02日
    瀏覽(29)
  • 深入理解網(wǎng)絡(luò)通信和TCP、IP協(xié)議-01

    深入理解網(wǎng)絡(luò)通信和TCP、IP協(xié)議-01

    計算機網(wǎng)絡(luò)是什么? 隨著計算機技術(shù)發(fā)展,計算機的體積和價格都在下降,之前計算機多用于研究機構(gòu),現(xiàn) 階段逐步進入一般的公司用于辦公。原來計算機之間傳輸數(shù)據(jù)需要通過軟盤等第三方存儲介 質(zhì)進行轉(zhuǎn)存,人們需要將數(shù)據(jù)直接通過通信線路傳輸,來縮短傳輸時間,于

    2024年02月16日
    瀏覽(26)
  • 深入理解TCP/IP協(xié)議:網(wǎng)絡(luò)通信的基石

    深入理解TCP/IP協(xié)議:網(wǎng)絡(luò)通信的基石

    提示:本系列文章重點學(xué)習(xí)TCP/IP協(xié)議 提示:在這里先對TCP/IP協(xié)議做一個概述,以便大家能更好的理解: TCP/IP協(xié)議是當今互聯(lián)網(wǎng)世界中最為重要的網(wǎng)絡(luò)通信協(xié)議之一,它承載了全球范圍內(nèi)數(shù)以億計的設(shè)備之間的通信。無論是在個人日常使用的智能手機,還是在企業(yè)級的網(wǎng)絡(luò)架

    2024年04月16日
    瀏覽(25)
  • 學(xué)習(xí)網(wǎng)絡(luò)編程No.2【深入理解TCP/IP】

    學(xué)習(xí)網(wǎng)絡(luò)編程No.2【深入理解TCP/IP】

    北京時間:2023/8/9/13:04,昨天在擺爛中把網(wǎng)絡(luò)基礎(chǔ)相關(guān)知識的博客更新,依然還是上不了C站熱榜,我估計是因為我賬號熱度不夠沒有上榜資格,也可能是因為前段時間沒有積極更新,導(dǎo)致周榜被甩出100名開外,反正應(yīng)該是因為更新文章不夠積極導(dǎo)致現(xiàn)在怎樣都上不了熱榜,不

    2024年02月13日
    瀏覽(34)
  • 學(xué)習(xí)網(wǎng)絡(luò)基礎(chǔ)No.2【深入理解TCP/IP】

    學(xué)習(xí)網(wǎng)絡(luò)基礎(chǔ)No.2【深入理解TCP/IP】

    北京時間:2023/8/9/13:04,昨天在擺爛中把網(wǎng)絡(luò)基礎(chǔ)相關(guān)知識的博客更新,依然還是上不了C站熱榜,我估計是因為我賬號熱度不夠沒有上榜資格,也可能是因為前段時間沒有積極更新,導(dǎo)致周榜被甩出100名開外,反正應(yīng)該是因為更新文章不夠積極導(dǎo)致現(xiàn)在怎樣都上不了熱榜,不

    2024年02月13日
    瀏覽(17)
  • 網(wǎng)絡(luò)編程——深入理解TCP/IP協(xié)議——OSI模型和TCP/IP模型:構(gòu)建網(wǎng)絡(luò)通信的基石

    網(wǎng)絡(luò)編程——深入理解TCP/IP協(xié)議——OSI模型和TCP/IP模型:構(gòu)建網(wǎng)絡(luò)通信的基石

    TCP/IP協(xié)議,即 傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議 ,是一組用于在計算機網(wǎng)絡(luò)中實現(xiàn)通信的協(xié)議。它由兩個主要的協(xié)議組成:TCP(傳輸控制協(xié)議)和IP(互聯(lián)網(wǎng)協(xié)議)。TCP負責確保數(shù)據(jù)的可靠傳輸,而IP則負責路由數(shù)據(jù)包以在網(wǎng)絡(luò)中傳遞。TCP/IP協(xié)議簇還包含其他輔助協(xié)議,如UDP(用戶數(shù)

    2024年02月14日
    瀏覽(33)
  • 深入學(xué)習(xí) Linux 操作系統(tǒng)的存儲 IO 堆棧

    深入學(xué)習(xí) Linux 操作系統(tǒng)的存儲 IO 堆棧

    當使用 read() 和 write() 系統(tǒng)調(diào)用向內(nèi)核提交讀寫 I/O 請求操作時需要經(jīng)歷的步驟: 1)首先,請求經(jīng)過虛擬文件系統(tǒng),虛擬文件系統(tǒng)提供了統(tǒng)一的文件和文件系統(tǒng)的相關(guān)接口,屏蔽了不同文件系統(tǒng)的差異和操作細節(jié); 2)其次,適配當前磁盤分區(qū)的文件系統(tǒng),常見文件系統(tǒng)有

    2024年02月08日
    瀏覽(19)
  • Linux TCP/UDP socket 通信和IO多路復(fù)用

    主機字節(jié)序 16 位值 == 網(wǎng)絡(luò)字節(jié)序 16 位值 主機字節(jié)序 32 位值 == 網(wǎng)絡(luò)字節(jié)序 32 位值 主機字節(jié)序的字符串IP地址? == 網(wǎng)絡(luò)字節(jié)序的整形IP地址 將監(jiān)聽的套接字和本地IP和端口進行關(guān)聯(lián) 給監(jiān)聽的套接字設(shè)置監(jiān)聽,開始檢測客戶端鏈接 等待并接受客戶端的連接,阻塞函數(shù),沒有客

    2024年02月05日
    瀏覽(26)
  • 【netty系列-01】深入理解網(wǎng)絡(luò)通信基本原理和tcp/ip協(xié)議

    【netty系列-01】深入理解網(wǎng)絡(luò)通信基本原理和tcp/ip協(xié)議

    Netty系列整體欄目 內(nèi)容 鏈接地址 【一】深入理解網(wǎng)絡(luò)通信基本原理和tcp/ip協(xié)議 https://zhenghuisheng.blog.csdn.net/article/details/136359640 【二】深入理解Socket本質(zhì)和BIO https://zhenghuisheng.blog.csdn.net/article/details/136549478 在最初的網(wǎng)絡(luò)中,是借鑒于這個OSI七層網(wǎng)絡(luò)模型,而在實際開發(fā)應(yīng)用中

    2024年03月17日
    瀏覽(32)
  • 【Linux】高級IO --- Reactor網(wǎng)絡(luò)IO設(shè)計模式

    【Linux】高級IO --- Reactor網(wǎng)絡(luò)IO設(shè)計模式

    人其實很難抵制誘惑,人只能遠離誘惑,所以千萬不要高看自己的定力。 1. 多路轉(zhuǎn)接接口select poll epoll所做的工作其實都是事件通知,只向上層通知事件到來,處理就緒事件的工作并不由這些API來完成,這些接口在進行事件通知時,有沒有自己的策略呢? 其實是有的,在網(wǎng)絡(luò)

    2024年02月09日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包