TCP协议重要原理

在OSI7层模型的基础上做了简化(4层模型)

  • 应用层
  • 表示层--应用层
  • 会话层
  • 传输层--主机到主机层
  • 网络层--互联网层
  • 数据链路层--接入层
  • 物理层

TCP协议:传输控制协议 --- 面向连接的网络协议

  • 优点:数据传输可靠性高
  • 缺点:数据传输效率低

UDP协议:用户报文协议 --- 无连接的网络协议

  • 优点:数据传输效率高
  • 缺点:数据传输可靠性低

TCP报文

8259f0f3c009183843c764b703641556.png

  • TCP协议报文结构

源端口:16个bit 2的16次方 1~65535

目标端口:16个bit 2的16次方 1~65535

控制字段:syn为1,请求建立连接控制字段

控制字段:fin为1,请求断开连接控制字段

控制字段:ack为1,数据信息确认控制字段

TCP三次握手过程(面试题)

可以使用Wireshark抓包工具查看

三次握手.png

1516188978910882.png

QQ截图20191204185438.png

  • 第一次握手:客户端发送syn请求建立连接控制字段,发送seq序列号信息(X),第一个数据包的系列号默认为0
  • 第二次握手:服务端发送syn请求建立连接控制字段,同时还会发送ack确认控制字段,发送seq序列号信息也为(Y), 还会发送ACK确认号(X+1)信息(对上一个数据序列号信息进行确认)
  • 第三次握手:客户端发送ack确认控制字段,发送seq序列号信息(X+1),发送ack确认号(Y+1)

TCP四次挥手过程和三次挥手过程(面试题)

可以使用Wireshark抓包工具查看

QQ图片20191204101807.png

1516189010282106.png

QQ截图20191204185931.png

四次挥手过程

  • 第一次挥手:客户端发送fin请求断开连接控制字段
  • 第二次挥手:服务端发送ack确认控制字段
  • 第三次挥手:服务端发送fin请求断开连接字段, 发送ack确认字段
  • 第四次挥手:客户端发送ack控制字段

QQ截图20191204185608.png

三次挥手过程

  • 第一次挥手:客户端发送fin请求断开连接控制字段
  • 第三次挥手:服务端直接发送fin请求断开连接字段, 发送ack确认字段
  • 第四次挥手:客户端发送ack控制字段

TCP的十一种状态集

1516189036794857.png

  • TCP三次握手
  1. 最开始两台主机都处于关闭状态 closed
  2. 服务端将相应服务进行开启 closed -> listen
  3. 客户端向服务端发出连接请求 closed -> syn_sent
  4. 服务端接收到连接请求,进行确认 listen -> syn_rcvd
  5. 客户端再次进行确认 syn_sent -> established
  6. 服务端接收到确认信息 syn_rcvd -> established
  • TCP四次挥手
  1. 客户端发送请求断开连接信息 established -> fin_wait1
  2. 服务端接收断开连接请求,并进行确认 established -> close_wait
  3. 客户端接收到了确认信息 fin_wait1 -> fin_wait2
  4. 服务端发送ack和fin字段 close_wait -> last_ack
  5. 客户端接收到请求断开连接信息,发送确认 fin_wait2 -> time_wait
  6. 服务端接收到确认信息 last_ack -> closed
  7. 客户端等待一段时间 time_wait -> closed

DNS解析原理

yum install -y dig bind-utils
#dig:可以查看域名解析过程
#bind-utils:DNS解析相关
#查看域名的解析过程
dig www.1997sty.com
#查看域名的详细解析过程
dig www.1997sty.com +trace
  1. 在浏览器输入blog.1997sty.com,操作系统会先查找本地的host文件,如果找到结果就返回
  2. 如果没有找到,就会查看本地的DNS缓存,如果找到结果就返回
  3. 如果没有找到,就会访问在设置的本地DNS服务器,该服务器会查找本地的资源,如果找到结果就返回
  4. 如果没有找到,会查找该DNS服务器的缓存,如果找到结果就返回
  5. 如果没有找到,该DNS服务器就会请求根DNS服务器,根DNS服务器就会返回.com顶级域名的服务器地址给本地DNS服务器
  6. .com顶级域名的服务器,会再次查找,返回下一级1997sty.com的DNS服务器地址给本地DNS服务器
  7. 重复以上动作,直到查询到blog.1997sty.com主机,结果返回给本地DNS服务器,本地DNS服务器再把结果返回给操作系统,解析并缓存该记录
  • 1-3的过程称为递归查找

递归:以相似的方式重复自身的过程.递归在程序中表现为,在函数的定义中直接或间接调用函数自身

  • 4-6的过程称为迭代查找

迭代:是一种为了逼近所需目标或结果,不断用变量的旧值递推新值的过程.迭代在程序中的表现为,函数不断调用原函数的返回值

QQ图片20191204102341.png

ARP解析原理

  • ARP : 已知IP地址解析mac地址信息
  • 作用 : 减少交换网络中广播的产生

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。

IP地址分类与子网划分

QQ图片20191204102545.png

IPV4

  • 有32位二进制组成,采用点分十进制分为4段,每段为8位二进制
  • 地址总数为:$$2^{32}=4294967296$$
  • 192.168.0.1 -> 11000000.10101000.00000000.00000001

IPV6

  • 地址总数为:$$2^{128}=340282366920938463463374607431768211456$$
  • 冒分十六进制表示法

格式为X:X:X:X:X:X:X:X,其中每个X表示地址中的16b,以十六进制表示

ABCD:EF01:2345:6789:ABCD:EF01:2345:6789

这种表示法中,每个X的前导0是可以省略的

2001:0DB8:0000:0023:0008:0800:200C:417A -> 2001:DB8:0:23:8:800:200C:417A

  • 0位压缩表示法

在某些情况下,一个IPv6地址中间可能包含很长的一段0,可以把连续的一段0压缩为::

但为保证地址解析的唯一性,地址中::只能出现一次,例如

FF01:0:0:0:0:0:0:1101 -> FF01::1101

0:0:0:0:0:0:0:1 -> ::1

0:0:0:0:0:0:0:0 -> ::

  • 内嵌IPv4地址表示法

为了实现IPv4-IPv6互通,IPv4地址会嵌入IPv6地址中,此时地址常表示为X:X:X:X:X:X:d.d.d.d,前96b采用冒分十六进制表示,而最后32b地址则使用IPv4的点分十进制表示,例如::192.168.0.1::FFFF:192.168.0.1就是两个典型的例子,注意在前96b中,压缩0位的方法依旧适用

二进制与十进制转换关系

  • 10000000 ---> 128
  • 01000000 ---> 64
  • 00100000 ---> 32
  • 00010000 ---> 16
  • 00001000 ---> 8
  • 00000100 ---> 4
  • 00000010 ---> 2
  • 00000001 ---> 1

IP地址的分类

按照地址的范围进行划分

QQ图片20191204102635.png

按照地址用途进行划分

  • 公网地址 : 全球唯一
  • 私网地址 : 重复利用地址,避免地址枯竭,私网地址网段不能出现在互联网路由器路由表

按照通讯方式划分

1516189135922431.png

特殊IP地址

1516189128330737.png

子网划分

  • 将一个大的网络划分成几个小的网络

不做子网划分

  • 造成地址浪费
  • 造成广播风暴
  • 造成路由压力

做子网划分

  • 节省IP地址
  • 减少广播影响
  • 减轻路由器压力

如何进行子网划分

  • 子网掩码: 32位二进制的数,IP地址网络位对应子网掩码置为1
  • 11111111 00000000 00000000 00000000 -> 255.0.0.0 A类 /8
  • 11111111 11111111 00000000 00000000 -> 255.255.0.0 B类 /16
  • 11111111 11111111 11111111 00000000 -> 255.255.255.0 C类 /24

IP地址网络位对应子网掩码置为1,所以前16位为网络位,后16位为主机位

172.16.0.0 255.255.0.0 也可以表示为 172.16.0.0/16

  • 10101100 00010000 00000000 00000000 -> 172.16.0.0
  • 11111111 11111111 00000000 00000000 -> 255.255.0.0

IP地址面试题

  • 已知地址信息172.16.0.0/18,可以划分几个子网,子网掩码信息,每个子网的主机地址范围
  1. 可以划分4个子网
  2. 子网掩码为255.255.192.0
  3. 4个子网分别为:
  • 172.16.0.1~172.16.63.254
  • 172.16.64.1~172.16.127.254
  • 172.16.128.1~172.16.191.254
  • 172.16.192.1~172.16.255.254

1516189280213079.png

办公环境上网原理

  1. 路由器里配置上网的用户名和密码信息 实现拨号访问外网 自动获取公网地址,或者配置静态地址配置,在路由器外网接口配置运营商给你的公网地址
  2. 需要在路由器上配置DHCP服务信息
  3. 和其他子网通讯需要配置路由信息

虚拟机主机上网原理

  • 使用nat模式,虚拟机会生成虚拟网卡,并组建一个子网,相当于一个虚拟路由器,最终主机通过,虚拟网卡->虚拟路由器->物理机网卡->路由器,访问外网
  • 使用桥接模式,虚拟机会生成虚拟网卡,最终主机通过,虚拟网卡->物理机网卡->路由器,访问外网

系统路由设置

  • 查看路由表命令
netstat -nr
route -n
ip route list
ip route show

Centos6临时修改路由表

  • route命令,配置后需要systemctl restart nerwork重启网卡,Centos7需要使用yum命令安装net-tools才能使用
#静态默认路由(网关地址)  添加与删除 还可以通过/etc/sysconfig/network-scripts/ifcfg-eth0文件GATEWAY参数修改
route add default gw 10.0.0.2
route del default gw 10.0.0.2

#静态网段路由 添加与删除
route add -net 10.0.3.0 netmask 255.255.255.0 gw 10.0.1.2
route add-net 10.0.3.0/24 gw 10.0.1.2
route del -net 10.0.3.0 netmask 255.255.255.0 gw 10.0.1.2

#静态主机路由 添加与删除
route add -host 10.0.3.201 dev eth1
route del -host 10.0.3.201 dev eth1

Centos7临时修改路由表

  • ip命令,配置后需要systemctl restart nerwork重启网卡
#静态默认路由(网关地址)  添加与删除 还可以通过/etc/sysconfig/network-scripts/ifcfg-eth0文件GATEWAY参数修改
ip route add default via 10.0.0.2
ip route del default via 10.0.0.2

静态网段路由 添加与删除
ip route add -net 10.0.3.0 netmask 255.255.255.0 via 10.0.1.2
ip route add -net 10.0.3.0/24 netmask 255.255.255.0 via 10.0.1.2
ip route del -net 10.0.3.0 netmask 255.255.255.0 via 10.0.1.2

#静态主机路由 添加与删除
ip route add -host 10.0.3.201 via 10.0.1.2
ip route del -host 10.0.3.201 via 10.0.1.2

永久设置路由表

  • /etc/sysconfig/network配置文件中配置(不太可行)
default via 192.168.3.1 dev eth0 #192.168.3.1为eth0网卡的网关地址
10.211.6.0/24 via 192.168.3.1 dev eth0
10.0.0.0/8 via 10.212.52.1 dev eth1 #10.212.52.1为eth1网卡的网关地址
  • /etc/sysconfig/network-scripts/route-{interferface}配置文件配置({interferface}为网卡接口,如eth0)
  • 其中网段地址和掩码全是0代表为所有网段,即默认路由
# cat /etc/sysconfig/network-scripts/route-eth0
0.0.0.0/0 via 192.168.3.1 dev eth0
10.211.6.0/24 via 192.168.3.1 dev eth0

# cat /etc/sysconfig/network-scripts/route-eth1
10.0.0.0/8 via 10.212.52.1 dev eth1

掩码法设置

# cat /etc/sysconfig/network-scripts/route-eth0
ADDRESS0=0.0.0.0
NETMASK0=0.0.0.0
GATEWAY0=192.168.3.1
ADDRESS1=10.211.6.0
NETMASK1=255.255.255.0
GATEWAY1=192.168.3.1

掩码法设置

# cat /etc/sysconfig/network-scripts/route-eth1
ADDRESS0=10.0.0.0
NETMASK0=255.0.0.0
GATEWAY0=10.212.52.1
  • /etc/sysconfig/static-routes配置(推荐)

默认不存在该文件,需要手动创建,net是范围,host可以单独指定某一台机器

# cat /etc/sysconfig/static-route
any net any gw 192.168.3.1
any net 10.211.6.0/24 gw 192.168.3.1
any net 10.0.0.0 netmask 255.0.0.0 gw 10.212.52.1
  • 之所以该方法也可以是因为/etc/init.d/network启动脚本会调用该文件
cat /etc/init.d/network

# Add non interface-specific static-routes.
if [ -f /etc/sysconfig/static-routes ]; then
   if [ -x /sbin/route ]; then
       grep "^any" /etc/sysconfig/static-routes | while read ignore args ; do
           /sbin/route add -$args
       done
   else
       net_log $"Legacy static-route support not available: /sbin/route not found"
   fi
fi
  • 写入rc.local开机执行
route add -net 10.8.0.0 255.255.255.0 gw 192.168.199.2