OSI的七层模型

OSI的七层参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。 OSI的七层模型分别为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层每一层都有相应的功能和协议

图片1.png

应用层 网络服务与最终用户的一个接口。 协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP 表示层 数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层) 格式有,JPEG、ASCll、EBCDIC、加密格式等 [2] 会话层 建立、管理、终止会话。(在五层模型里面已经合并到了应用层) 对应主机进程,指本地主机与远程主机正在进行的会话 传输层 定义传输数据的协议端口号,以及流控和差错校验。 协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层 网络层 进行逻辑地址寻址,实现不同网络之间的路径选择。 协议有:ICMP IGMP IP(IPV4 IPV6) 数据链路层 建立逻辑连接、进行硬件地址寻址、差错校验 [3] 等功能。(由底层网络定义协议) 将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。 物理层 建立、维护、断开物理连接。(由底层网络定义协议)

TCP/IP分层

TCP/IP共定义了模型与OSI的七层模型所对应 四层模型为网络访问层、Internet层、传输层、应用层 五层模型为物理层、数据链路层、Internet层、传输层、应用层 图片2.png


链路层

以太网协议规定,接入网络的设备都必须安装网络适配器,即网卡,数据包必须是从一块网卡传送到另一块网卡。而网卡地址就是数据包的发送地址和接收地址,有了MAC地址以后,以太网采用广播形式,把数据包发给该子网内所有主机,子网内每台主机在接收到这个包以后,都会读取首部里的目标MAC地址,然后和自己的MAC地址进行对比,如果相同就做下一步处理,如果不同,就丢弃这个包。 所以链路层的主要工作就是对电信号进行分组并形成具有特定意义的数据帧,然后以广播的形式通过物理介质发送给接收方。


网络层

IP协议 网络层引入了IP协议,制定了一套新地址,使得我们能够区分两台主机是否同属一个网络,这套地址就是网络地址,也就是所谓的IP地址。IP协议将这个32位的地址分为两部分,前面部分代表网络地址,后面部分表示该主机在局域网中的地址。如果两个IP地址在同一个子网内,则网络地址一定相同。为了判断IP地址中的网络地址,IP协议还引入了子网掩码,IP地址和子网掩码通过按位与运算后就可以得到网络地址。 ARP协议 即地址解析协议,是根据IP地址获取MAC地址的一个网络层协议。其工作原理如下:ARP首先会发起一个请求数据包,数据包的首部包含了目标主机的IP地址,然后这个数据包会在链路层进行再次包装,生成以太网数据包,最终由以太网广播给子网内的所有主机,每一台主机都会接收到这个数据包,并取出标头里的IP地址,然后和自己的IP地址进行比较,如果相同就返回自己的MAC地址,如果不同就丢弃该数据包。ARP接收返回消息,以此确定目标机的MAC地址;与此同时,ARP还会将返回的MAC地址与对应的IP地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。 路由协议 首先通过IP协议来判断两台主机是否在同一个子网中,如果在同一个子网,就通过ARP协议查询对应的MAC地址,然后以广播的形式向该子网内的主机发送数据包;如果不在同一个子网,以太网会将该数据包转发给本子网的网关进行路由。网关是互联网上子网与子网之间的桥梁,所以网关会进行多次转发,最终将该数据包转发到目标IP所在的子网中,然后再通过ARP获取目标机MAC,最终也是通过广播形式将数据包发送给接收方。而完成这个路由协议的物理设备就是路由器,路由器扮演着交通枢纽的角色,它会根据信道情况,选择并设定路由,以最佳路径来转发数据包。 所以,网络层的主要工作是定义网络地址、区分网段、子网内MAC寻址、对于不同子网的数据包进行路由。


传输层 链路层定义了主机的身份,即MAC地址,而网络层定义了IP地址,明确了主机所在的网段,有了这两个地址,数据包就从可以从一个主机发送到另一台主机。但实际上数据包是从一个主机的某个应用程序发出,然后由对方主机的应用程序接收。而每台电脑都有可能同时运行着很多个应用程序,所以当数据包被发送到主机上以后,是无法确定哪个应用程序要接收这个包。因此传输层引入了UDP协议来解决这个问题,为了给每个应用程序标识身份。 UDP协议 UDP协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。UDP协议比较简单,实现容易,但它没有确认机制,数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP协议就诞生了。 TCP协议 TCP即传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。简单来说TCP就是有确认机制的UDP协议,每发出一个数据包都要求确认,如果有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。为了保证传输的可靠性,TCP协议在UDP基础之上建立了三次对话的确认机制,即在正式收发数据前,必须和对方建立可靠的连接。TCP数据包和UDP一样,都是由首部和数据两部分组成,唯一不同的是,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。 传输层的主要工作是定义端口,标识应用程序身份,实现端口到端口的通信,TCP协议可以保证数据传输的可靠性。


应用层 理论上讲,有了以上三层协议的支持,数据已经可以从一个主机上的应用程序传输到另一台主机的应用程序了,但此时传过来的数据是字节流,不能很好的被程序识别,操作性差,因此,应用层定义了各种各样的协议来规范数据格式,常见的有http,ftp,smtp等,在请求Header中,分别定义了请求数据格式Accept和响应数据格式Content-Type,有了这个规范以后,当对方接收到请求以后就知道该用什么格式来解析,然后对请求进行处理,最后按照请求方要求的格式将数据返回,请求端接收到响应后,就按照规定的格式进行解读 所以应用层的主要工作就是定义数据格式并按照对应的格式解读数据


TCP与UDP的区别

TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂。 Internet 协议集支持一个无连接的传输协议,该协议称为用户数据包协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法 Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。


基于协议大致总结TCP与UDP的区别为 1、基于连接与无连接;

2、对系统资源的要求(TCP较多,UDP少);

3、UDP程序结构较简单;

4、TCP保证数据正确性,UDP可能丢包;

5、TCP保证数据顺序,UDP不保证。

TCP协议的三次握手

2964446aa923712d5218eeb.png 第一次 第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers)。 第二次 第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。 第三次 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据

TCP的四次挥手

619111109161J31.png 对于一个已经建立的连接,TCP使用改进的四次挥手来释放连接(使用一个带有FIN附加标记的报文段)。TCP关闭连接的步骤如下: 第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)。 第二步,主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。
第三步,主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段。 第四步,主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放。

linux中网络配置(centos)

网络配置文件

ip地址配置

/etc/sysconfig/network-scripts/ifcfg-IFACE

主机名

#centos6 之前版本
/etc/sysconfig/network
HOSTNAME=
#centos7 以后版
/etc/hostname 
HOSTNAME

主机名与IP地址映射关系,优先与DNS

/etc/hosts

DNS解析

/etc/resolv.conf
nameserver DNS_SERVER_IP1
nameserver DNS_SERVER_IP2
nameserver DNS_SERVER_IP3
search DOMAIN

修改/etc/hosts和dns的优先级

/etc/nsswitch.conf 
hosts: files dns

centos修改网卡配置

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet
BOOTPROTO=static #static为静态配置可以改为dhcp自动获取
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.1.100
PREFIX=24      #这里写网络位可以改为METMASK=xxx.xxx.xxx.xxx写为子网掩码
GATEWAY=192.168.1.1
DNS1=114.114.114.114

关于网卡重启

#centos6中
[root@centos6 ~]service network restart|stop|start
#centos7中
[root@centos6 ~]systemctl restart|stop|start|status network
#centos8中
[root@centos8 ~]# nmcli con reload
[root@centos8 ~]# nmcli con up eth0

ubuntu网络配置

Ubuntu网卡配置文件必须采用YAML格式路径为/etc/netplan/xxx.yaml存放

可以每个网卡对应一个单独的配置文件,也可以将所有网卡都放在一个配置文件里

root@shi:/etc/netplan# cat eth0.yaml 
networks:
  version: 2
  ethernets:
          eth0:
          	dhcp4:yes   #若dhcp自动获取则下面的配置不用写
            addresses: [192.168.8.10/24,10.0.0.10/8]  #或者用下面两行,两种格式不能混用
            - 192.168.1.44/24
            - 10.0.0.90/24
            gateway4: 192.168.1.1
            nameserver: 
              addresses: [114.114.114.114,8.8.8.8]
root@shi:/etc/netplan# 

修改网卡配置文件生效

root@ubuntu1804:~#netplan apply

centos链路聚合(bond)

第一种通过修改配置文件实现(centos8为例)

[root@localhost ~]#vim /etc/sysconfig/network-scripts/ifcfg-bond0
NAME=bond0
TYPE=bond
DEVICE=bond0
BOOTPROTO=none
IPADDR=10.0.0.100
PREFIX=8
#miimon指定链路监测时间间隔。如果miimon=100,那么系统每100ms 监测一次链路连接状态,如果有一
条线路不通就转入另一条线路
BONDING_OPTS="mode=1 miimon=100 fail_over_mac=1"

[root@localhost ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
NAME=eth0
DEVICE=eth0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes

[root@localhost ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth1
NAME=eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes
[root@localhost ~]# nmcli con reload
[root@localhost ~]# nmcli con up eth0
[root@localhost ~]# nmcli con up eth1 
#重启时注意顺序先启动没有链接的网卡否则远程链接会断掉

第二种适用于centos7以上版本 nmcli实现bond

[root@localhost ~]# nmcli con
NAME                UUID                                  TYPE      DEVICE 
eth0                5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03  ethernet  eth0   
Wired connection 1  c2a31e74-2b5a-3cbf-8b6f-3454e19d50fb  ethernet  eth1   
#添加bonding接口
[root@localhost ~]# nmcli con add type bond con-name bond0 ifname bond0 mode active-backup ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1
Connection 'bond0' (fdca1be5-1470-4c13-9832-a373db9b88fd) successfully added.
[root@localhost ~]# nmcli con
NAME                UUID                                  TYPE      DEVICE 
eth0                5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03  ethernet  eth0   
Wired connection 1  c2a31e74-2b5a-3cbf-8b6f-3454e19d50fb  ethernet  eth1   
bond0               fdca1be5-1470-4c13-9832-a373db9b88fd  bond      bond0  
#添加从属接口
[root@localhost ~]# nmcli con add type bond-slave  ifname eth0 master bond0
Connection 'bond-slave-eth0' (72e4b4cc-3b01-4ff1-af73-70ddc76f208f) successfully added.
[root@localhost ~]# nmcli con add type bond-slave  ifname eth1 master bond0
Connection 'bond-slave-eth1' (9a00f212-b3c7-4335-ae62-b26ff99b061b) successfully added.
[root@localhost ~]# nmcli con
NAME                UUID                                  TYPE      DEVICE 
eth0                5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03  ethernet  eth0   
Wired connection 1  c2a31e74-2b5a-3cbf-8b6f-3454e19d50fb  ethernet  eth1   
bond0               fdca1be5-1470-4c13-9832-a373db9b88fd  bond      bond0  
bond-slave-eth0     72e4b4cc-3b01-4ff1-af73-70ddc76f208f  ethernet  --     
bond-slave-eth1     9a00f212-b3c7-4335-ae62-b26ff99b061b  ethernet  --   
#要启动绑定,则必须首先启动从属接口
[root@localhost ~]# nmcli con up bond-slave-eth1     #重启时注意顺序先启动没有链接的网卡否则远程链接会断掉
Connection successfully activated (D-Bus active path:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@localhost ~]# nmcli con up bond-slave-eth0     #重启时注意顺序先启动没有链接的网卡否则远程链接会断掉
Connection successfully activated (D-Bus active path:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@localhost ~]# nmcli con
NAME                UUID                                  TYPE      DEVICE 
bond0               fdca1be5-1470-4c13-9832-a373db9b88fd  bond      bond0  
bond-slave-eth0     72e4b4cc-3b01-4ff1-af73-70ddc76f208f  ethernet  eth0   
bond-slave-eth1     9a00f212-b3c7-4335-ae62-b26ff99b061b  ethernet  eth1   
eth0                5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03  ethernet  --     
Wired connection 1  c2a31e74-2b5a-3cbf-8b6f-3454e19d50fb  ethernet  --     
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:fc:8b:a1 brd ff:ff:ff:ff:ff:ff permaddr 00:0c:29:fc:8b:97
3: eth1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:fc:8b:a1 brd ff:ff:ff:ff:ff:ff
4: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:fc:8b:a1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global noprefixroute bond0
       valid_lft forever preferred_lft forever
    inet6 2408:822a:75:7280:33d1:f9aa:a3fb:e52a/64 scope global dynamic noprefixroute 
       valid_lft 259163sec preferred_lft 172763sec
    inet6 fe80::d29:b960:a8de:6f19/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
#启动绑定(若已启动则不需要)
nmcli con up mybond0