路由器网络中数据包传输分析
本篇介【běn piān jiè】绍一个基础的【jī chǔ de】知识,关于数🐗据包在🆘路由器中是如🐆何进行【hé jìn háng】传输和【chuán shū hé】交换的,只要明白这点【bái zhè diǎn】🚄,那么对你配置【nǐ pèi zhì】👍出一个🈴好的网络环境会有很大的帮【dà de bāng】助🌄。
一、输入的问题
1、原始套【yuán shǐ tào】接口可【jiē kǒu kě】⛸以接收到任何😲TCP或UDP报文。
2、要想接收到原【shōu dào yuán】始套接口【kǒu】,首先要🛩接收的数据包【shù jù bāo】🐇必须有🥧一个完🐡整的、正确的IP头,否则不【fǒu zé bú】能通过ip_rcv()中的包头检查【tóu jiǎn chá】🍲和检验和验证【hé yàn zhèng】🛸。
3、在原始【zài yuán shǐ】套接口💗接收的【de】🦎数据包【shù jù bāo】过程中【guò chéng zhōng】📖,内核会对接收的【de】🦎IP包进行【háng】🏳校验和🤗验证🍲,但不会对IP包以后的【de】🦎任何字段进【duàn jìn】🐢行检测【háng jiǎn cè】🕸和验证🍲。如,我们创🤐建原始套接口💗时🥔,所指定【suǒ zhǐ dìng】的【de】🦎protocol参数为【wéi】IPPROTO_TCP,内核也不会进行【háng】TCP校验和🤗验证🍲,而是直🏚接把IP头中协【tóu zhōng xié】议字段🏿为【wéi】TCP的【de】🦎所有数据包【shù jù bāo】都复制一份⛪,提交给【tí jiāo gěi】该原始【gāi yuán shǐ】套接口💗。
4、用原始【yòng yuán shǐ】🕸套接口接收到【jiē shōu dào】的🕧TCP包都是🏷进行了【jìn háng le】IP重组以后,TCP排序以前的报【qián de bào】🍶文。
5、如果在【rú guǒ zài】⛵创建原始套接【shǐ tào jiē】❤口时,所指定✒的protocol参数不【cān shù bú】为零,(socket的第三🔻个参数),则接收到的数【dào de shù】据报的协议字段应该与之匹配。否则该【fǒu zé gāi】🍚数据报不传递【bú chuán dì】👔给该套【gěi gāi tào】🆗接口。
6、如果此原始套接口上【jiē kǒu shàng】🎥绑定了一个本地【dì】🚈IP地址【dì zhǐ】🎟,那么接收到的💅数据报【shù jù bào】🌪的目的【de mù de】IP地址【dì zhǐ】应🔫该与该🧓绑定的【bǎng dìng de】IP地址【dì zhǐ】🎟相匹配【xiàng pǐ pèi】,否则该数据包将不传递到该套接口。
7、如果此【rú guǒ cǐ】原始套🚦接口通【jiē kǒu tōng】过【guò】🔡connect指定了【zhǐ dìng le】一个对方IP地址,那么接收到的⏰数据包【shù jù bāo】➕的源IP地址应与该以连接地址相匹配💉,否则该✒数据包【shù jù bāo】➕不传递【bú chuán dì】给该套接口【jiē kǒu】。
8、如果一【rú guǒ yī】🍲个原始套接口以👇protocol参数为0的方式创建,并且未调用【diào yòng】connect或bind,那么对于内核传递给【chuán dì gěi】🥃原始套接口的每一个原始数【yuán shǐ shù】据报,该套接【gāi tào jiē】🌀口都会【kǒu dōu huì】🔳收到一💄份拷贝【fèn kǎo bèi】🎌。
9、原始套💘接口接【jiē kǒu jiē】收不到任何的ARP或【huò】🥑RARP协议类【xié yì lèi】⏱型的套接口,因为net_rx_action()会把【huì bǎ】🛅ARP或【huò】🥑RARP协议类【xié yì lèi】⏱型的数【xíng de shù】据包传递给🍧ARP的接收🍨函数类处理【chù lǐ】,不会传【bú huì chuán】递给🍧IP层的接收🍨函数ip_rcv()。
10、原始套接口并【jiē kǒu bìng】不是可以接收【yǐ jiē shōu】到任何的😋ICMP类型的📖数据包【shù jù bāo】,因为有【yīn wéi yǒu】📝些🛥ICMP类型的📖数据包【shù jù bāo】在传递【chuán dì】🉑给原始🧒套接口之前已经被系统所响应【yīng】,并不再向上层【xiàng shàng céng】传递【chuán dì】⬆。
11、如果对方的数据包分【jù bāo fèn】🔟片了〽,由于原【yóu yú yuán】始套接【shǐ tào jiē】⛹口的接收是在IP上层,所以会【suǒ yǐ huì】🏂接收到重组以【chóng zǔ yǐ】💪后的原始IP包。
二、输出的问题
1、普通输【pǔ tōng shū】出通常【chū tōng cháng】🔁通过sendto或🕷sendmsg并指定目的IP地址来【dì zhǐ lái】完成🍬,如果套🏖接口已经连接,也可以【yě kě yǐ】🔪调用【diào yòng】write、writev或🕷send。
2、如果IP_HDRINCL选项未设置【shè zhì】,则内核🔝写的数【xiě de shù】据起始地址是IP头部【tóu bù】之🛶后的第🍏一个字节。因为这【yīn wéi zhè】种情况下😢,内核将构造【gòu zào】IP头部【tóu bù】🌯,并将它😰安在来【ān zài lái】自进程数据之前【qián】。内核将IPv4头部【tóu bù】🌯的协议字段设置【shè zhì】成用户【hù】🎫在调用【zài diào yòng】🐖socket函数时【hán shù shí】🐖所给的第三个参数💐。
3、如果【rú guǒ】IP_HDRINCL选项已设置【shè zhì】,则内核【zé nèi hé】写的数据其实🚰地址是🤦IP头部的【tóu bù de】第一个字节。用户所提供的数据必🗯须包括🐽IP头部。此时进📯程构造【chéng gòu zào】除了以🦇下两项🔴以外的整个IP头部:IPv4标示字🐶段可以🍰设为0,要求内㊙核设置【hé shè zhì】⬜该值。而且仅当该字段为【duàn wéi】0时,内核才【nèi hé cái】为其设【wéi qí shè】🍜置,IPv4头部校验和由【yàn hé yóu】内核来【nèi hé lái】计算和存储【cún chǔ】。
4、如果创【rú guǒ chuàng】建原始套接口时指定【shí zhǐ dìng】🔬了协议类型,即第三个参数【gè cān shù】protocol,那也并不是说只能发该类型的数据🎸包【bāo】。如,即使将【jí shǐ jiāng】🚓protocol指定为【wéi】🤬 IPPROTO_TCP,也可以⛏发送用户自己🗯组装的UDP报文🤾,不过此【bú guò cǐ】🚪时如果🏗IP_HDRINCL选项未【xuǎn xiàng wèi】设置【shè zhì】,那么内【nà me nèi】核将会在🈂IP头的协【tóu de xié】议字段🛸指明后面的报文🤾为【wéi】TCP报文🤾(不过此【bú guò cǐ】🚪时却为【shí què wéi】UDP报文🤾)。
等数据包发送【bāo fā sòng】到对方TCP层【céng】,一般说来会因【lái huì yīn】为找不👻到合适【dào hé shì】的TCP套接口接收该【jiē shōu gāi】数据包而被丢弃。不过该🔽包可以✌在目标【zài mù biāo】😰主机的【zhǔ jī de】🔇原始套➗接口上👷接收到。
5、正如前面所述,任何时候【hòu】🧥,IP头的校【tóu de xiào】📴验和都是由内【shì yóu nèi】核来设😫置的。
6、内核任【nèi hé rèn】何时候那会都【nà huì dōu】⏮不会对【bú huì duì】✡IP包以后的字段【de zì duàn】😽进行校验和验🍳证【zhèng】。如🎾,即使我【jí shǐ wǒ】们指定第三个参数protocol为🥅IPPROTO_TCP,在数据🕟发送时【fā sòng shí】内核也不会对【bú huì duì】✡进行TCP校验和计算和验证【zhèng】。
7、如果IP_HDRINCL选项已【xuǎn xiàng yǐ】设置,按照常规,我们应该组建【gāi zǔ jiàn】➡自己的【de】IP头【tóu】🛌,但是即使我们【shǐ wǒ men】没有组【méi yǒu zǔ】建➡IP头【tóu】🛌,用🍘sendto或🚲sendmsg 并指定目的【mù de】IP地址来🙎发送数【fā sòng shù】据是照【jù shì zhào】样可以🍈完成的【de】。但是这样的【de】数据包【jù bāo】📕在目标机上用🍘原始套【yuán shǐ tào】接口是接收不到🚽的【de】,因为在【yīn wéi zài】ip_rcv()中要对IP头【tóu】进行👇验证🦍,并且要🛤分析校验和,所以该包会被丢弃🥞,不过在链路层应该能【yīng gāi néng】♑够接收【gòu jiē shōu】🌔到该数【dào gāi shù】据包【jù bāo】📕。
8、如果设置了【zhì le】IP_HDRINCL选项⛅,并且数据包超🏎长【zhǎng】💖,那么数【nà me shù】📺据会被丢弃【diū qì】,并会返【bìng huì fǎn】✍回出错码【mǎ】EMSGSIZE。如果未【rú guǒ wèi】🔷设置IP_HDRINCL选项⛅,并且数据包超🏎长【zhǎng】💖,那么数【nà me shù】📺据包会被分片。
正是因🚻为数据包😇具上述【jù shàng shù】的结【de jié】🥤构,安装了【ān zhuāng le】TCP/IP协议的电脑之🌭间才能相互通【xiàng hù tōng】信,在使用【zài shǐ yòng】🐽基于🍣TCP/IP协议的网络时,网络中其实传【qí shí chuán】递的就是数据【shì shù jù】包😇。
关键词:路由器
阅读本文后您有什么感想? 已有 人给出评价!
- 0
- 0
- 0
- 0
- 0
- 0