加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

TCP/IP协议栈之数据包怎样穿越各层协议

发布时间:2019-08-21 20:25:04 所属栏目:教程 来源:架构师之路
导读:全部互联网处事,均依靠于TCP/IP协议栈。分明数据是如安在协议栈传输的,将会辅佐你晋升互联网措施的机能息争决TCP相干题目的手段。 我们报告在Linux场景下数据包是如安在协议层传输的。 1. 发送数据 应用层发送数据的进程大抵如下: 我们把上述处理赏罚进程的
副问题[/!--empirenews.page--]

全部互联网处事,均依靠于TCP/IP协议栈。分明数据是如安在协议栈传输的,将会辅佐你晋升互联网措施的机能息争决TCP相干题目的手段。

我们报告在Linux场景下数据包是如安在协议层传输的。

1. 发送数据

应用层发送数据的进程大抵如下:

TCP/IP协议栈之数据包怎样穿越各层协议(绝对干货)

我们把上述处理赏罚进程的地区大抵分为:

  • User地区
  • Kernel 地区
  • Device地区

在user和kernel地区的使命都是由本机cpu执行,这两个地区归并称为host地区,以区分device地区(收集接口卡上有单独的cpu)。device是吸取和发送数据包的收集接口卡(Network Interface Card),一样平常也称为LAN card。

当应用措施挪用write(fd, buf, len)来发送数据时,用户态地区会进入内核态地区,成立这个相关的纽带是socket fd和体系挪用write。

在内核态的socket有两个buffer:

  • send socket buffer,用于发送数据
  • receive socket buffer,用于吸取数据

当write体系挪用被执行,用户态的数据(buf,长度)会被拷贝到内核地区的内存,并被放入到send socket buffer的末端(见下图,发送是凭证次序发送的),然后TCP就会被挪用。

TCP/IP协议栈之数据包怎样穿越各层协议

TCP中的数据布局是TCB(TCP Control Block)。TCB包括了执行TCP会话所必要的信息,包罗TCP毗连状态,吸取窗口,拥塞窗口,序号,重传timer 等。

TCP会建设TCP数据分段,而TCP数据分段包罗TCP header和payload,如下图:

TCP/IP协议栈之数据包怎样穿越各层协议(绝对干货)

Payload是待发送的socket buffer中的数据,而TCP header是为了TCP靠得住发送数据而加的帮助信息。

这些数据分段会进入到IP层,IP层会加上IP头部信息到数据分段,如下图:

TCP/IP协议栈之数据包怎样穿越各层协议(绝对干货)

IP在执行路由之前会去搜查Netfilter LOCAL_OUT钩子,看是否必要执行iptables相干设置。之后执行IP路由。IP路由首要成果是探求下一跳(譬喻网关或路由器)的IP地点,而路由的目标是达到目标地IP地点地址的呆板。

IP执行路由之后,搜查Netfilter POST_ROUTING钩子,假若有iptables在这方面的设置,就会去执行相干操纵。委托给数据链路层之前,IP层还会执行ARP(收集地点转换),通过下一跳IP地点来查找目标MAC地点,并把Ethernet头部添加到IP数据包,如下图。

TCP/IP协议栈之数据包怎样穿越各层协议(绝对干货)

IP层同时还给用户提供了raw socket接口,即发送数据包的接口。raw socket发送的数据包与正常流程的数据包纷歧样,在执行Netfilter的时辰,会跳过这些钩子。

IP层做完事变往后,会把数据包(上图中的数据包,一样平常称frame)委托给数据链路层。

因为ARP已经把目标MAC地点写入到数据包头部,这样就减轻了驱动driver的事变。进入数据链路层后,内核会去检测是否有抓包器材在监听抓包(譬喻tcpdump),假若有,内核会拷贝数据包信息到抓包器材的内存地点空间。

之后,按照必然的协议法则,驱动driver会要求NIC转达这个数据包。当NIC收到这个哀求后,NIC复制数据包到本身的内存里,而且发送给收集。当NIC发送完一个数据包,会发生一其间断, 主机 cpu去执行间断处理赏罚措施,完成后续事变。

2. 吸取数据

应用措施吸取数据的进程大抵如下:

TCP/IP协议栈之数据包怎样穿越各层协议(绝对干货)

起首NIC把数据包写入本身的内存,并校验数据包是不是有用的,假如是有用的,把数据包写入主机的内存空间,然后NIC给主机操纵体系发送一其间断信号,这时就进入到kernel地区。

在数据链路层,内核起首会做数据包检测,然后Driver驱动把数据包举办改装,以便后续TCP/IP可以或许领略这个数据包。改装完往后,按照Ethernet头部信息中的Ethertype分发给上层,假设为IPv4,去除Ethernet头部,并发送给IP层。值得留意的是,委托给IP层之前,假若有抓包器材在监听抓包,那么内核就会拷贝数据包信息到抓包器材的内存地点空间。

IP层通过计较checksum来校验IP头部的checksum是否有用,假若有用,接着搜查PRE_ROUTING钩子(好比查察是否有iptables的响应设置必要执行),然后执行IP路由,IP路由会判定这个数据包是当地处理赏罚照旧转发当前数据包到其余主机。假如是转发数据包,执行FORWARD和POST_ROUTING钩子,并转发给数据链路层;假如是当地处理赏罚,IP还会搜查LOCAL_IN钩子,执行完往后,按照IP头部信息的proto值,假设为TCP,去除IP头部,并把数据包转达给上层TCP。值得留意的是,委托给TCP层之前,假若有raw socket在监听抓包,那么内核会拷贝数据包信息到raw socket的内存地点空间(默认tcpcopy操作raw socket来监听IP层的数据包)。

TCP层会按照TCP checksum来检测数据包是否有用(假如回收了checksum offload,NIC会去做相干计较),然后就给这个数据包查找响应的TCB(TCP control block),查找的要领是通过如下组合信息来查找:

  1. <source IP, source port, target IP, target port> 

假如没有查到,一样平常会发送reset数据包;假如查到了,进入TCP数据包处理赏罚环节。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读