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

TCP/IP协议栈之数据包如何穿越各层协议

发布时间:2019-08-25 00:22:50 所属栏目:教程 来源:架构师之路
导读:所有互联网服务,均依赖于TCP/IP协议栈。懂得数据是如何在协议栈传输的,将会帮助你提升互联网程序的性能和解决TCP相关问题的能力。 我们讲述在Linux场景下数据包是如何在协议层传输的。 1. 发送数据 应用层发送数据的过程大致如下: 我们把上述处理过程的

用户应用程序根据读事件去执行读操作,用户态空间进入到内核空间。内核把socket buffer里面的内容复制到用户指定的内存区域,然后把socket buffer读取过的内容释放,TCP增加接收窗口大小,如果有必要,会传递一个更新窗口的数据包给对端TCP。例如下图,TCP发送了一个ack数据包,用于通知对端TCP,本方TCP接收窗口更新了。

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

读取操作完成后,返回应用程序,应用程序就可以进行对数据进行处理了。

3. 抓包工具工作原理

知道了数据如何发送和接收以后,我们分析一下tcpdump抓包原理。

在数据链路层和IP层交界的地方(属于数据链路层,如下图),是数据包被tcpdump捕获的场所。

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

执行到这个交界处时,内核会去查看tcpdump是否在监听,一旦有监听,就把数据包内容放入到tcpdump设置的缓冲区。理论上只要tcpdump及时去提取数据,在线上压力不大的情况下,抓包不会丢包。

tcpdump所抓到的数据包,仅仅是代表数据包经过了链路层和网络层之间的交界处。从网卡进来的数据包未来的命运,可能是继续一路往前走到TCP,也有可能在IP层被干掉,还有可能被路由转发出去;从本机发送出去的数据包,一旦被tcpdump捕获到,说明已经到了数据链路层,没有被IP层过滤掉,因为如果数据包被IP层过滤掉,这些数据包就不会到达tcpdump捕获点,也不会出现在抓包文件里。

下面我们通过一些实验来验证上述结论。

实验之前,我们先介绍一下iptables工具。iptables是被广泛使用的防火墙工具,它主要跟内核netfilter数据包过滤框架进行交互。

(1) 实验 LOCAL_IN过滤

我们在服务器上面配置如下的iptables命令:

  1. iptables -I INPUT -p tcp --dport 3306 -s 172.17.0.2 -j QUEUE 

上述iptables命令设置了"-I INPUT"参数,意味着在netfilter LOCAL_IN钩子处执行上述iptables规则,即通往服务器端TCP之前,如果匹配到上述iptables规则,则会被放入目标QUEUE(默认情况下是直接丢弃数据包),不再继续前行。

具体命令执行见下图:

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

设置上述iptables后,当172.17.0.2访问172.17.0.3 3306服务时,IP数据包(如下图绿色箭头)会在服务器端IP层被丢弃掉,而红色箭头所指方向是tcpdump抓包的地方。

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

我们开启tcpdump抓包:

  1. tcpdump -i any tcp and port 3306 and host 172.17.0.2 -n -v 

在172.17.0.2上利用MySQL客户端命令访问172.17.0.3上面的3306服务,如下图:

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

结果经过长时间等待,最终显示连接不上。

服务器端抓包结果如下:

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

我们看到第一次握手数据包反复重传。

利用netstat命令,查看有没有相应的TCP状态,结果发现没有,如下图:

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

正常情况下,没有TCP状态,说明数据包没有进入服务器端TCP,第一次握手数据包在服务器端IP层被干掉了。

利用netstat -s命令,在服务器端TCP/IP统计参数里找线索:

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

上图服务器端IP层接收到20079个数据包,下图接收到20086个数据包,MySQL客户端登入过程累计增加了7个数据包,正好符合抓包文件显示的7个第一次握手数据包。

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

在服务器端TCP层,对比上面两张图,数据没有任何变化,说明了服务器端TCP没有收到任何数据包。

实验说明了在服务器端IP层进来的方向干掉数据包,服务器端TCP层不会有任何变化。

(2) 实验 LOCAL_OUT过滤

我们这次实验的目的是查看IP层netfilter LOCAL_OUT情况下的抓包情况。

如下图:

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

我们设置如下iptables命令:

  1. iptables -I OUTPUT -p tcp --sport 3306 -d 172.17.0.2 -j QUEUE 

具体操作如下图:

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

(编辑:核心网)

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

热点阅读