Linux网络基础协议和ip管理

1、简述osi七层模型和TCP/IP五层模型

 osi七层模型分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

  1)物理层:这一层的主要功能是二进制传输数据,界定连接器和网线的规格;为启动、维护以及关闭物理链路定义了电气规范、机械规范、过程规范和功能规范

  2)数据链路层:这一层的主要功能是互连设备之间传送和识别数据帧;定义如何格式化数据以便进行传输以及如何控制对网络的访问

  3)网络层:这一层的主要功能是地址管理和路由选择;路由数据包,选择传递数据的最佳路径,支持逻辑寻址和路径选择

  4)传输层:这一层主要功能是管理两个节点之间的数据传输,负责可靠传输;确保数据传输的可靠性(确保数据被可靠地传送到目标地址);建立、维护和终止虚拟电路;通过错误检查和恢复;信息流控制来保障可靠性。

  5)会话层:这一层的主要功能是通信管理;建立、管理和终止在应用程序之间的会话。

  6)表示层:这一层的主要功能是设备固有数据格式和网络标准数据格式的转换;确保接受系统可以读出该数据、格式化数据、构建数据;协商用于应用层的数据传输语法;提供加密。

  7)应用层:这一层的主要功能是针对特定应用协议为其应用程序进程提供网络服务;提供用户身份验证。

tcp/ip协议栈把网络分为5层结构,分别是物理层、数据链路层、internet层和应用层。

  1)物理层:负责数据传输的硬件,这种硬件就相当于以太网或电话线路等物理层的硬件。

  2)数据链路层:数据链路层也叫数据接口层,它是利用以太网中的数据链路层进行通信。我们可以理解为网卡驱动程序,驱动程序是在操作系统与硬件之间起桥梁作用的软件。我们在使用计算机外围设备时,不是把外围设备插上就可以马上可以使用,通常还需要相应的驱动程序支持才可以。

   3)internet层:internet层使用ip 协议,它相当于OSI模型中的第3层网络层。IP协议基于ip地址转发、分组数据报文。

  4)传输层:TCP/IP的传输层有两个具有代表行的协议(tcp/udp),该层的功能本身与OSI参考模型中的传输层类似;传输层的最主要功能就是能够让应用程序之间实现通信,在计算机内部,通常同一时间运行着众多程序,为此,我们用端口号来识别这些程序。

  5)应用层:TCP/IP的分层模型中将OSI参考模型中的会话层、表示层和应用层的功能都集中到了应用层中实现。这些功能有时由一个点一的程序实现,有时也有可能会有多个程序实现,因此,细看TCP/IP的应用层的功能会发现,它不仅仅实现OSI模型中的应用层的内容,它还要实现会话层与表示层的功能。

2、总结描述TCP三次握手四次挥手

 tcp三次握手如上图所示:

  第一次握手:客户端主动向服务端发送连接请求报文,SYN=1(请求建立连接),seq=x(x是一个随机正整数),然后客户端从CLOSED状态转变为SYN_SENT状态;

  第二次握手:服务端收到来自客户端的syn包会回复一个确认报文给客户端的SYN(ack=x+1)表示服务端已经收到了客户端的连接请求,同时服务端也发送一个SYN包(SYN=1,ACK=1,seq=y其中SYN=1,ACK=1表示服务端同意客户端的连接请求。),服务端将确认包和SYN包一并发送给客户端,然后服务端由LISTEN状态转变为SYN_RCVD状态;

  第三次握手:客户端收到服务端的确认包和SYN包后,客户端会回复一个确认包(ACK=1,seq=x+1,ack=y+1),ACK=1表示上一条的确认号字段有效,此时,当服务端收到来自客户端的回复报文后,客户端和服务端的状态都会变成ESTABLISHED状态,有了上面三次握手后,后续就可以正常的收发数据了;

Linux网络基础协议和ip管理

tcp/ip四次挥手如上图所示:

  第一次挥手:客户端主动向服务端发送FIN=1,seq=u,表示断开连接请求。客户端从ESTABLISHED状态转化为FIN-WAIT-1的状态;

  第二次挥手:服务端收到客户端的断开连接请求,服务端会回复客户端一个确认包(ACK=1,seq=v,ack=u+1)表示服务端已经收到了客户端的断开连接请求,此时服务端不会立马断开,它还要看它这边的数据是否传输完毕,若没有传输完毕,它将会继续传输数据,直到把数据传输完。客户端收到服务端的确认报文后,客户端状态由FIN-WAIT-1变为FIN-WAIT-2,服务端由ESTABLISHED状态变为CLOSE-WAIT状态;

  第三次挥手:当服务端把数据传输完后,它会再向客户端发送一条断开请求的报文(FIN=1,ACK=1,seq=w,ack=u+1),表示服务端已经把数据传输完毕,断开吧。此时服务端的状态由CLOSE-WAIT状态变为LAST-ACK状态;

  第四次挥手:当客户端收到服务端的断开请求后,客户端会回复服务端一条确认断开请求的确认包(ACK=1,seq=u+1,ack=w+1),表示同意服务端断开连接,此时客户端的状态由FIN-WAIT-2变为TIME-WAIT状态,服务端收到客户端的确认包后,服务端的状态变为CLOSED状态,客户端会等待2MSL后(MSL表示最长报文段生存时间),状态变为CLOASED;

3、描述TCP和UDP区别

   1)tcp是一种面向连接的传输层协议,它可以保证两端通信主机之间的通信可达。tcp能够正确处理在传输过程中丢包、传输顺序乱掉等异常情况,此外tcp还能够有效利用带宽,缓解网络拥堵。udp有别于tcp,它是一种面向无连接的传输层协议,udp不会关注对端是否真的收到了传送过去的数据,如果需要检查对端是否接收到分组数据包,或者对端是否连接到网络,则需要在应用程序中实现。

  2)tcp对系统资源的要求较多,upd较少;

  3)tcp是数据流模式(sock_stream)而udp是数据报模式(sock_dgram);

  4)tcp工作效率没有udp工作效率高

4、总结ip分类以及每个分类可以分配的IP数量

   ip地址是由两部分组成网络ID和主机ID,网络ID标识网络,每个网段分配一个网络ID;主机ID标识单个主机,由组织分给各设备;

  ipv4地址格式:点分十进制记法;ip地址是一个32位二进制数;可将此32位二进制划分为四组8位二进制八位数,使之可读;每组二进制八为数(或字节)均可转换成十进制数;地址可使用点分十进制记录

A类地址:

  0 000 0000 - 0 111 1111(1-127),网络数:2^7=127,每个网络中的主机数为:2^24,其中要减去两个特殊地址 网络Id.0.0.0和网络id.255.255.255,所以每个网络中的可用地址为2^24-2,默认的子网掩码是255.0.0.0,私网地址:10.0.0.0 - 10.255.255.255,公共ip地址范围1.0.0.0 - 9.255.255.255  11.0.0.0 - 126.255.255.255,其中127.0.0.1-127.255.255.254为本机回环地址,主要用于测试。

B类地址:

  10 00 0000 - 10 111 1111(128-191),网络数:2^14,每个网络中的主机数为:2^16-2(也要减去两个特殊地址),默认子网掩码:255.255.0.0,私网地址范围:172.16.0.0-172.31.255.255,公共ip地址范围128.0.0.0 - 172.15.255.255   172.32.0.0 - 191.255.255.255

C类地址:

  110 0 0000 - 110 1 1111(192-223),网络数:2^21,每个网络中的主机数为:2^8-2(也要减去两个特殊地址),默认子网掩码:255.255.255.0,私网地址范围:192.168.0.0-192.168.255.255,公共ip地址范围192.0.0.0 -192.167.255.255  192.169.0.0 - 223.255.255.255

D类地址:

  1110 0000 - 1110 1111(224-239),组播地址

E类地址为保留地址未使用,其范围1111000 - 11111111 (240-255)

通过上面的分类,一个网络的网络数等于2^(网络ID位数),网络中的主机数等于2^(主机ID位数)-2,其中主机ID位数等于32-默认子网掩码位数,比如A类地址的网络数2^7其中7表示网络ID为数是7,网络中的主机数等于2^(32-8)-2

特殊地址:

0.0.0.0:它不是一个真正意义上的ip地址,它表示所有不清楚的主机和目标网络

255.255.255.255:限制广播地址,对本机来说,这个地址指本网段内(同一广播域)的所有主机

127.0.0.1 - 127.255.255.254:本机回环地址,主要用于测试。在传输介质上永远不应该出现目标地址为“172.0.0.1”的数据包

224.0.0.0 - 239.255.255.255:组播地址,224.0.0.1特指所有主机,224.0.0.2特指所有路由器,224.0.0.5指OSPF路由器,组播地址多用于一些特定的程序以及多媒体程序

169.254.x.x:如果windows主机使用DHCP自动分配IP地址,而又无法从DHCP服务器获取ip地址,系统就会为主机分配这样的地址。

5、总结IP配置方法

永久配置方法:

  1)修改网卡配置文件

vim /etc/sysconfig/network-scripts/ifcfg-enp2s0

  说明:后面的ifcfg-enp2s0根据实际情况网卡的名称来修改

TYPE=Ethernet                                                                                                          
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR="192.168.0.99"
NETMASK="255.255.255.0"
GATEWAY="192.168.0.1"
DNS1="192.168.0.1"
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp2s0
UUID=ea718503-8af8-41d8-97b1-b394995a22ca
DEVICE=enp2s0
ONBOOT=yes
IPV6_PRIVACY=no

  说明:这里的配置文件需要写明几个重点的参数,BOOTPROTO=static表示使用静态ip,配置了BOOTPROTO=none或者static都表示使用静态IP需要再配置指定的IP地址,子网掩码,网关等;IPADDR表示指定的IP地址,NETMASK表示子网掩码,GATEWAY表示指定网关地址,DNS1表示主DNS地址,DEVICE表示网卡对应的设备别名,ONBOOT表示开机是否启用网卡。其他的参数可以不用设置。

  2)保存配置文件后,重启网络服务

/etc/init.d/network restart   ##centos6
service network restart       ##centos6、centos7都可以使用
systemctl restart network    ##centos7

当然我们也可以用图形工具和字符工具配置ip地址,centos6上字符工具有setup (当然我们需要安装对应的包setuptool)centos7上字符工具有nmtui (对应的包NetworkManager-tui)。centos7命令行工具有nmcli (对应的包NetworkManager),这个工具使用有些复杂,后续再总结。

临时配置方法:

  1)ifconfig命令添加网卡别名:

[root@test ~]#ifconfig 
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:bd:55:ad:ff  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.99  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::230:18ff:fe51:af3c  prefixlen 64  scopeid 0x20<link>
        ether 00:30:18:51:af:3c  txqueuelen 1000  (Ethernet)
        RX packets 33830  bytes 30390958 (28.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17385  bytes 1649969 (1.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp3s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 00:30:18:51:af:3d  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 8  bytes 424 (424.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 424 (424.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@test ~]#ifconfig enp2s0:0 192.168.0.100/24 
[root@test ~]#ifconfig 
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:bd:55:ad:ff  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.99  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::230:18ff:fe51:af3c  prefixlen 64  scopeid 0x20<link>
        ether 00:30:18:51:af:3c  txqueuelen 1000  (Ethernet)
        RX packets 33905  bytes 30397068 (28.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17441  bytes 1657579 (1.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp2s0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.100  netmask 255.255.255.0  broadcast 192.168.0.255
        ether 00:30:18:51:af:3c  txqueuelen 1000  (Ethernet)

enp3s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 00:30:18:51:af:3d  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 8  bytes 424 (424.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 424 (424.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@test ~]#

  说明:以上命令是给enp2s0这个网卡绑定一个临时地址,当然我们重启网络服务这个地址将不会保存,或者我们不想要这个地址了,可以用ifconfig enp2s0 down 命令将其禁用

  2)ip命令添加网卡别名

[root@test ~]#ip addr show enp2s0
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:30:18:51:af:3c brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.99/24 brd 192.168.0.255 scope global noprefixroute enp2s0
       valid_lft forever preferred_lft forever
    inet6 fe80::230:18ff:fe51:af3c/64 scope link 
       valid_lft forever preferred_lft forever
[root@test ~]#systip addr add 172.16.1.2/16 dev enp2s0  
[root@test ~]#ip addr add show2s0                 
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:30:18:51:af:3c brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.99/24 brd 192.168.0.255 scope global noprefixroute enp2s0
       valid_lft forever preferred_lft forever
    inet 172.16.1.2/16 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet6 fe80::230:18ff:fe51:af3c/64 scope link 
       valid_lft forever preferred_lft forever
[root@test ~]#

  说明:以上命令是给enp2s0网卡绑定一个地址为172.16.1.2/24的地址

[root@test ~]#ip addr add show2s0                 
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:30:18:51:af:3c brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.99/24 brd 192.168.0.255 scope global noprefixroute enp2s0
       valid_lft forever preferred_lft forever
    inet 172.16.1.2/16 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet6 fe80::230:18ff:fe51:af3c/64 scope link 
       valid_lft forever preferred_lft forever
[root@test ~]#ip addr add 172.16.1.3/16 dev enp2s0 label enp2s0:0 
[root@test ~]#ip addr add show enp2s0
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:30:18:51:af:3c brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.99/24 brd 192.168.0.255 scope global noprefixroute enp2s0
       valid_lft forever preferred_lft forever
    inet 172.16.1.2/16 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 172.16.1.3/16 scope global secondary enp2s0:0
       valid_lft forever preferred_lft forever
    inet6 fe80::230:18ff:fe51:af3c/64 scope link 
       valid_lft forever preferred_lft forever
[root@test ~]#

  说明:以上命令表示给enp2s0网卡绑定ip为172.16.1.3/16的地址,并设置标签名为enp2s0:0,这个标签名必须是已经有的网络设备名后面加冒号数字

[root@test ~]#ip a s enp2s0
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:30:18:51:af:3c brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.99/24 brd 192.168.0.255 scope global noprefixroute enp2s0
       valid_lft forever preferred_lft forever
    inet 172.16.1.2/16 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 172.16.1.3/16 scope global secondary enp2s0:0
       valid_lft forever preferred_lft forever
    inet6 fe80::230:18ff:fe51:af3c/64 scope link 
       valid_lft forever preferred_lft forever
[root@test ~]#ip addr flush dev enp2s0 label enp2s0:0
[root@test ~]#ip addr  s enp2s0
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:30:18:51:af:3c brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.99/24 brd 192.168.0.255 scope global noprefixroute enp2s0
       valid_lft forever preferred_lft forever
    inet 172.16.1.2/16 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet6 fe80::230:18ff:fe51:af3c/64 scope link 
       valid_lft forever preferred_lft forever
[root@test ~]#

  说明:以上命令表示清除某条网卡别名上的记录,当然想要全部清空,则可以选择重启网络服务即可

root@test network-scripts]#cat ifcfg-enp2s0:0
DEVICE=enp2s0:0
IPADDR=172.16.1.2
NETMASK=255.255.0.0
GATEWAY=172.16.1.1
[root@test network-scripts]#

  说明:若想要永久的保存网卡别名地址,我们可以在/etc/sysconfig/network-scripts/目录下新建一个名为ifc-网卡别名的文件如:ifc-enp2s0:0,内容如上所示