網(wǎng)絡(luò)編程有很多,java是我們最常用的,也是最普遍的,與此同時(shí),linux也是非常受到程序員小編歡迎的。那么linux網(wǎng)絡(luò)協(xié)議棧分幾層您了解嗎?下面一起來(lái)認(rèn)識(shí)一下。
網(wǎng)絡(luò)在現(xiàn)如今離我們的生活很近,所以了解相關(guān)的網(wǎng)絡(luò)協(xié)議棧很重要。linux網(wǎng)絡(luò)協(xié)議棧分幾層?了解網(wǎng)絡(luò)安全常識(shí),首先就要了解計(jì)算機(jī)網(wǎng)絡(luò)安全有哪些基本注意事項(xiàng),下面佰佰安全網(wǎng)小編就帶您認(rèn)識(shí)一下吧。
(一)驅(qū)動(dòng)程序?qū)?
本文中以一個(gè)realtek8139系列網(wǎng)卡作為例子,因?yàn)槠潋?qū)動(dòng)只有一個(gè)c文件(/drivers/net/8139too.c),比較容易分析。讀者也可以參考e1000網(wǎng)卡的另一篇文章(點(diǎn)這里)。內(nèi)核版本基于2.6.11。
驅(qū)動(dòng)程序加載/注冊(cè)主要包括以下的步驟:
(a)將設(shè)備驅(qū)動(dòng)程序(pci_driver)添加到內(nèi)核驅(qū)動(dòng)程序鏈表中;
(b)調(diào)用每個(gè)驅(qū)動(dòng)中的probe函數(shù)(其中重要一步就是初始化net_device對(duì)象)。
pci_module_init是一個(gè)宏定義,實(shí)際上就等于pci_register_driver函數(shù)。(在2.6.30內(nèi)核版本中,直接變成了returnpci_register_driver(&rtl8139_pci_driver) )。pci_register_driver函數(shù)的注釋說(shuō)明了它的作用:register a new pci driver.Adds the driver structure to the list ofregistered drivers。
(二)設(shè)備無(wú)關(guān)層/網(wǎng)絡(luò)協(xié)議層/協(xié)議無(wú)關(guān)接口socket層
系統(tǒng)初始化的過(guò)程中會(huì)調(diào)用do_basic_setup函數(shù)進(jìn)行一些初始化操作。其中2.6.11內(nèi)核中就直接包括了driver_init()驅(qū)動(dòng)程序初始化,以及sock_init函數(shù)初始化socket層。然后do_initcalls()函數(shù)調(diào)用一組前綴為_(kāi)_init類(lèi)型(這個(gè)宏就表示為需要在系統(tǒng)初始化時(shí)執(zhí)行)的函數(shù)。與網(wǎng)絡(luò)相關(guān)的以__init宏標(biāo)記的函數(shù)有:net_dev_init初始化設(shè)備無(wú)關(guān)層;inet_init初始化網(wǎng)絡(luò)協(xié)議層。
(a)net_dev_init(在文件/net/core/dev.c中):設(shè)備操作層
staticint __init net_dev_init(void)
{
if (dev_proc_init())
if(netdev_sysfs_init())
INIT_LIST_HEAD(&ptype_all);
for (i = 0; i <16; i++)
INIT_LIST_HEAD(&ptype_base[i]);
for (i = 0; i <ARRAY_SIZE(dev_name_head); i++)
INIT_HLIST_HEAD(&dev_name_head[i]);
for (i = 0; i <ARRAY_SIZE(dev_index_head); i++)
INIT_HLIST_HEAD(&dev_index_head[i]);
//Initialise the packet receive queues.
for (i = 0; i < NR_CPUS; i++) {
struct softnet_data*queue;
queue =&per_cpu(softnet_data, i);
skb_queue_head_init(&queue->input_pkt_queue);
queue->throttle = 0;
queue->cng_level = 0;
queue->avg_blog = 10; /* arbitrary non-zero */
queue->completion_queue = NULL;
INIT_LIST_HEAD(&queue->poll_list);
set_bit(__LINK_STATE_START,&queue->backlog_dev.state);
queue->backlog_dev.weight =weight_p;
queue->backlog_dev.poll =process_backlog;
atomic_set(&queue->backlog_dev.refcnt, 1);
}
open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL);
open_softirq(NET_RX_SOFTIRQ, net_rx_action, NULL);
}
這個(gè)函數(shù)所做的具體工作主要包括:初始化softnet_data這個(gè)數(shù)據(jù)結(jié)構(gòu)(每個(gè)CPU都有一個(gè)這樣的隊(duì)列,表示要交給此CPU處理的數(shù)據(jù)包);注冊(cè)網(wǎng)絡(luò)相關(guān)軟中斷(參見(jiàn)我關(guān)于軟中斷的文章,點(diǎn)這里)。
(b)inet_init(在文件/net/ipv4/af_inet.c中):網(wǎng)絡(luò)層
由于各種網(wǎng)絡(luò)協(xié)議是按照協(xié)議族(protocolfamily,PF或者address family,AF)為單位組織起來(lái)的。我們?cè)谶@里僅以Internet協(xié)議族(AF_INET或者PF_INET,在內(nèi)核中這二者是等價(jià)的)為例。
有時(shí)候這一層又被稱為INETsocket層(對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)為struct sock),請(qǐng)注意與BSD socket層區(qū)別(對(duì)應(yīng)數(shù)據(jù)結(jié)構(gòu)為struct socket):BSD socket層提供一組統(tǒng)一的接口,與協(xié)議無(wú)關(guān);但具體到網(wǎng)絡(luò)層就必須與協(xié)議相關(guān)了,因此操作也會(huì)有一些不同。
關(guān)于網(wǎng)絡(luò)安全小知識(shí),佰佰安全網(wǎng)小編為您介紹和普及這么多了,看完上面的介紹,您對(duì)“l(fā)inux網(wǎng)絡(luò)協(xié)議棧分幾層”這個(gè)問(wèn)題了解多少了呢?想了解更多關(guān)于網(wǎng)絡(luò)安全的其他相關(guān)知識(shí),敬請(qǐng)關(guān)注我們網(wǎng)站上的詳細(xì)內(nèi)容介紹。
責(zé)任編輯:慕丹萍
linux網(wǎng)絡(luò)路徑中網(wǎng)絡(luò)協(xié)議棧有幾種
不使用系統(tǒng)自身網(wǎng)絡(luò)協(xié)議棧怎么測(cè)試
計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議有幾層
2022.07.20 14:45:53
2022.07.20 14:40:44
2022.07.20 14:38:45
2022.07.20 14:37:10
2022.07.20 14:33:05
2022.04.21 11:20:29
07/16在網(wǎng)絡(luò)上發(fā)表過(guò)激言論有什么危害?
04/10網(wǎng)絡(luò)安全防范措施與應(yīng)用
07/17wifi開(kāi)著時(shí)需不需要關(guān)閉移動(dòng)網(wǎng)絡(luò)數(shù)據(jù)?