本章重点介绍了
TCP/IP
协议族中的各种协议,比如ARP
协议,ICMP
协议,DNS
协议,同时展示了使用tcpdump
进行通信过程中的抓包方法,同时还介绍了arp
和host
命令的使用方法,这里使用知识点的方式来记录这一章节的内容
-
TCP/IP
协议族体系结构和主要协议,分别介绍了应用层,传输层,网络层还有数据链路层 -
数据链路层: 实现网卡接口的网络驱动程序,让数据在物理媒介上传输,同时隐藏底层物理网络的电气特性,重要协议比如
ARP
协议和RARP
协议,作用都是实现IP
协议和物理地址(MAC
地址)之间的转换 , 这里可以粗略的把数据链路层的作用概括为把IP
地址转换为物理地址 -
网络层: 作用是完成数据包的选路和转发(其实分为控制平面和数据平面,依赖于控制平面的算法来实现选路和负载均衡等功能) , 最核心的协议就是
IP
协议,同时典型的协议还有ICMP
协议,ICMP
协议的格式如下,注意ICMP
协议需要IP
协议的支持,也就是需要利用IP
协议进行包装,ICMP
协议的格式如下: 其中类型表示报文的作用(反映差错还是重定向) , 代码表示细分条件 -
传输层: 为主机之间提供端到端的通信,典型协议比如
TCP
协议和UDP
协议,各个层级之间的关系如下: 传输层的协议说明:TCP
协议: 提供可靠传输,面向连接的基于流的服务,TCP
的读写缓冲区都存在于内核空间中从而使得读写更加快捷,同时内核中页存储者许多TCP
的其他的状态比如连接状态信息等,并且会保存发送的数据(滑动窗口)UDP
协议: 提供无连接的,不可靠的,基于数据报的服务,可以理解为只是单独发送一次,UDP
在内核中的缓冲区在发送数据之后就会把数据丢弃,不会保存数据
-
应用层: 利用传输层协议提供的服务,处理应用程序的逻辑,应用层协议如下(可以通过查看
/etc/services
文件查看知名的应用层协议):ping
程序,底层使用ICMP
协议telnet
协议: 远程登录协议ssh
协议DNS
协议,域名解析协议
-
以太网帧的封装过程:
TCP
报文段的封装过程: 发送TCP
报文的过程如下:- 首先把数据从用户空间复制到内核空间的
TCP
发送缓冲区中 - 之后把缓冲区中的数据和
TCP
头部信息封装成IP
数据报中的数据 - 利用
IP
报文头部信息和报文信息封装以太网帧,利用物理媒介传递数据报 以太网帧的格式如下:
- 首先把数据从用户空间复制到内核空间的
-
分用: 表示底层的协议封装的数据报中需要包含使用的上层协议,比如以太网中需要包含上一层使用的协议(
ARP
还是IP
协议),根据协议来确定需要报数据交给内核中的哪一个模块 -
ARP
协议 , 作用: 把IP
地址转换为物理地址,ARP
报文结构如下:ARP
协议的工作过程:- 首先利用自己的以太网地址(
MAC
地址)和IP
地址来构建数据报报 - 之后广播数据报(把目的端以太网地址使用
ff:ff:ff:ff:ff:ff
) 即可 - 目的主机接收到信息之后改变操作并且把自己的
IP
地址填充到数据报中发送回去
- 首先利用自己的以太网地址(
-
ARP
高速缓存,存储着最近经常访问的主机的IP
地址到物理地址的映射关系,可以使用如下命令查看ARP
缓存和删除缓存
arp -a # 查看高速缓存
arp -d IP # 删除对应的高速缓存
arp -s IP MAC # 添加对应的缓存项
- 可以使用
tcpdump
命令进行通信过程中的抓包,参考: 利用tcpdump抓包 ,这里记录tcpdump
的常用形式:
# tcpdump 命令的基本格式如下:
tcpdump options proto dir type
# options 选项,比如 -i interface
# proto 协议 比如 ip,ip6,tcp,udp,icmp等
# dir 数据流向 dst/src
# type 类型过滤器 net host 等
# 下面是对于 proto , dir , type 等类型的过滤器的说明
# dir -> 根据数据流向过滤
# type -> 根据种类过滤 比如 host(主机) port(端口) net(网段)
tcpdump src net 192.168.10.0/24
tcpdump src port 80 or 8880
tcpdump src portrange 80-8880
# 根据协议 proto 进行过滤
tcpdump icmp # 查看 icmp报文
tcpdump 'ip proto tcp'
tcpdump 'ip6 proto tcp' # 表示 ip6 中的 tcp
# 重要的选项
tcpdump -i interface 指定网卡
# 另外 tcpdump 中还包含条件组合的功能,此时如果出现特殊符号比如 () , 需要使用 () 保卫
tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'
# tcpdump 实战使用
tcpdump -i eth0 -ent '(dst 192.168.0.2 and src 192.168.0.10) or (dst 192.168.1.2 and src 192.168.1.3)'
# 利用 tcpdump 观察 DNS 通信过程,其中 -s 指定包的大小 , port domain 表示只是抓取使用域名服务的包
sudo tcpdump -i wlp0s20f3 -nt -s 500 port domain
DNS
协议的工作原理:DNS
的作用: 域名解析协议,DNS
报文如下,具体的内容可以参考书籍P13-14
:- 由于传输层,网络层数据链路层协议都是在
kernel
中实现的,所以需要提供一组系统调用来供用于使用,socket
就是这样一组系统调用 host
用于利用DNS
请求进行域名的查询,比如host -t A www.baidu.com
其中,-t
表示查询的记录类型