网络协议和管理
一、OSI七层模型

二、建立TCP连接:三次握手、断开TCP连接:四次挥手

●序号(seq):占用4个字节,表示本报文段所发送数据的第一个字节的编号,他的编号范围是0-2^32-1,即4294967296,当序号增加到2^32-1之后,下一个序号将又重新绕回到0开始编号。编号的方式是每个分包的起始字节号,例如第一次要发送的数据分包编号为seq=1,如果这次发送的数据长度是len=10字节,则下个分包的编号是seq=11,依次类推。
●确认号(ack):占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
●ACK位:占用1个比特位,其值为0或1,ACK=1时才表明前面的ack确认号字段是有效的,当ACK=0时,确认号字段无效。TCP要求,连接建立完成之后,ACK字段总是设置为1.
●SYN位:占用1个比特位,其值为0或1,用于同步编号。当SYN=1而ACK=0时,说明连接尚未建立,所以这是一个TCP的连接请求,如果对方接受连接请求,则回复时将设置SYN=1且ACK=1。SYN会在连接建立后设置为0,所以SYN=1表示这是TCP连接建立前的请求或响应包,此时结合ACK即可判断是请求还是响应。
●FIN位:占用1个比特位,其值为0或1,当FIN=1时,表明请求释放TCP连接。
三次握手
TCP在传输数据之前,首先需要建立好TCP连接,后续所有数据都基于这个已建立的连接来传输。

首先服务端B的服务进程已经监听在某个端口上,监听之后就可以一直等待客户端请求建立TCP连接
1、当客户端A想要和B建立TCP连接时,首先会发送一个连接请求报文给服务端B。在这个请求报文中,TCP首部中的SYN为设置为1,ACK位设置为0,假设此时的序号是x,即SYN=1、ACK=0、seq=x。这个包也称为SYN包,当客户端发送完SYN包后,它将进入SYN_SENT状态。
2、当B收到该报文后,发现其中的SYN=1、ACK=0,便知道这是一个TCP连接的请求包。如果B确认与A建立TCP连接,那么B需要回复A。回复时,SYN=1、ACK=1、ack=x+1、seq=y。注意区分这里的ACK和ack,ACK表示的是占用一个比特位的ACK位置位,ack是确认号。这个包通常被称为ACK包,当服务端发送完ACK包之后,它将进入SYN_RECV状态。
3、当A收到B的回复报文后,发现里面的SYN=1、ACK=1,于是也会向B回复一个ACK包,回复时,SYN=0、ACK=1、seq=x+1、ack=y+1。这里的SYN=0、ACK=1表示这不是建立连接的请求包,而是回复包。A发送完之后,就进入ESTABLISHED状态,表示连接在A这端已经建立完成。
4、B最终收到A的ACK包之后,也将进入ESTABLISHED状态,到此,TCP连接就建立完成。
B回复A时,也发送了一个SYN=1的包,相当于也是在请求A去建立TCP连接,所以A最后回复了一个ACK包。
四次挥手
建立TCP连接需要三次握手过程,在TCP连接断开(或释放)的时候则需要四次挥手的过程

首先两端在开始释放TCP连接之前,都已经处于ESTABLISHED状态,假设现在A端开始请求释放连接(B端也可以主动释放连接)
1、A首先发送一个TCP首部中FIN位置为1的包给B端,假设此时序号是u,即seq=u。FIN=1意味着这是一个请求关闭TCP连接的数据包,这种包也称为FIN包。当发送FIN包之后,A将从ESTABLISHED状态转变为FIN-WAIT-1状态。
2、B收到FIN包之后,发现其中FIN=1,知道A端请求关闭,于是发一个回复包给A。回复时,设置ACK=1,ack=u+1,同时还设置序号seq=v(假设B现在发送到的数据序号是v),发送完这个回复包之后,服务端进入CLOSE-WAIT状态。到了这个阶段,A(主动请求关闭方)到B(被动方)方向的连接就已经释放了,A不能再发送传输数据给B,但是B到A方向的连接还没有关闭,它可以持续发送数据给A,A也会接受。因为在这个阶段只有一个方向的连接被释放,所以close-wait状态也称为半关闭状态。
3、当A收到B的ACK包之后,它将进入FIN-WAIT-2,等待B发起从B到A方向的连接关闭请求。
4、当B确认已经没有数据发送给A后,B开始主动关闭从B到A方向的TCP连接,这时会发送一个FIN包,同时ACK设置为1,ack仍然保持不变,是u+1,而seq则为一个新值w,因为进入CLOSE-WAIT之后,B可能还发送了一些数据。B发送完这个FIN+ACK包之后,将进入LAST-ACK(最后确认)状态。
5、当A收到B的FIN+ACK包之后,需要对B发送的关闭请求做出回复。回复时,ACK=1,seq=u+1不变,ack=w+1。当发送完这个ACK包之后,A不会立即就关闭,而是进入TIME-WAIT阶段等待一段时间(2倍的MSL时长)。
6、当B收到A的回复ACK包之后,意味着B到A方向的连接关闭已经确认了,于是B端关闭连接。
7、当A等待了2MSL的时长之后,将真正关闭连接。
三、IP地址
私有IP地址
A:10.0.0.0-10.255.255.255即10.0.0.0/8
B:172.16.0.0-172.31.255.255即172.16.0.0/12
C:192.168.0.0-192.168.255.255即192.168.0.0/16
子网划分计算公式:
网段数:2^可变网络ID的位数
主机数:2^主机ID的位数-2=2^(32-网络ID的位数)-2 >=120
网络ID:可以用来判断当前主机在哪个网段,netmaskID=IP^netmask
划分子网:将大网分成若干个小网,网络ID向主机ID借N位,可以划分为2^N个子网
合并超网:若干个小网合并成一个大网,主机ID向网络ID借位
四、网络配置
ss命令
-t:tcp协议相关
-u:udp协议相关
-w:裸套接字相关
-x:unix sock相关
-l:listen状态的连接
-a:所有
-n: 数字格式
-p:相关的程序及PID
-e:扩展的信息
-m:内存用量
-o:计时器信息
1、ss -nt 显示当前系统有哪些建立连接信息
[20:48:36 root@Centos7 ~]#ss -nt State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 10.0.0.9:22 10.0.0.1:56748
2、ss -ntl 查看当前系统有哪些处于监听状态的端口
[20:50:26 root@Centos7 ~]#ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 [::1]:25 [::]:* LISTEN 0 128 [::]:22 [::]:*
3、ss -ntlu 查看当前系统有哪些开启的udp端口
[20:52:07 root@Centos7 ~]#ss -ntlu Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:68 *:* tcp LISTEN 0 100 127.0.0.1:25 *:* tcp LISTEN 0 128 *:22 *:* tcp LISTEN 0 100 [::1]:25 [::]:* tcp LISTEN 0 128 [::]:22 [::]:*
查看常用服务端口号
[21:06:29 root@Centos7 ~]#cat /etc/services
ip命令
1、禁用eth1网卡
[21:06:29 root@Centos7 ~]#ip link set eth1 down
2、网卡临时改名
[21:06:29 root@Centos7 ~]#ip link set eth1 name gjz
3、启用eth1网卡
[21:06:29 root@Centos7 ~]#ip link set eth1 up
五、Centos6和Centos7、8网络配置
centos6修改网卡名称
修改下面的文件
[root@Centos6 ~]#vim /etc/udev/rules.d/70-persistent-net.rules
1 # This file was automatically generated by the /lib/udev/write_net_rules 2 # program, run by the persistent-net-generator.rules rules file. 3 # 4 # You can modify it, as long as you keep each rule on a single 5 # line, and change only the value of the NAME= key. 6 7 # PCI device 0x8086:0x100f (e1000) 8 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:b9:93:0a", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
ethtool
mii-tool
查看网卡状态信息(适用于centos6、7、8)
[root@Centos6 ~]#ethtool eth0 Settings for eth0: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supported pause frame use: No Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: No Advertised auto-negotiation: Yes Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 0 Transceiver: internal Auto-negotiation: on MDI-X: off (auto) Supports Wake-on: d Wake-on: d Current message level: 0x00000007 (7) drv probe link Link detected: yes
[root@Centos6 ~]#mii-tool eth0
eth0: negotiated 100baseTx-FD, link ok
centos6重新加载网卡
[root@Centos6 ~]#service network restart
centos7、8重新加载网卡
[21:24:26 root@Centos8 ~]#nmcli connection up eth0
完整的网卡配置信息
1 TYPE="Ethernet" 接口类型;常见的有Ethernet,Bridge 2 PROXY_METHOD="none" 3 BROWSER_ONLY="no" 4 BOOTPROTO="static" 激活此设备时使用的地址配置协议 5 IPADDR=10.0.0.9 指名IP地址 6 NETMASK=255.255.255.0 子网掩码 7 GATEWAY=10.0.0.2 网关 8 DNS1=180.76.76.76 第一个DNS服务器 9 DNS2=223.6.6.6 第二个DNS服务器 10 DEFROUTE="yes" 11 IPV4_FAILURE_FATAL="no" 12 IPV6INIT="yes" 13 IPV6_AUTOCONF="yes" 14 IPV6_DEFROUTE="yes" 15 IPV6_FAILURE_FATAL="no" 16 IPV6_ADDR_GEN_MODE="stable-privacy" 17 NAME="eth0" 此配置文件应用到的设备 18 UUID="64318eb4-1bf8-433a-8cf5-e149ad034b20" 设备的唯一标识 19 DEVICE="eth0" 设备名 20 ONBOOT="yes" 在系统引导时是否激活此设备
验证网卡是否配置正确
ifconfig查看ip地址是否生效
1 [21:36:14 root@Centos7 ~]#ifconfig 2 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 3 inet 10.0.0.9 netmask 255.255.255.0 broadcast 10.0.0.255 4 inet6 fe80::36db:48f0:9bf1:e63a prefixlen 64 scopeid 0x20<link> 5 inet6 fe80::c172:90f2:11f3:fede prefixlen 64 scopeid 0x20<link> 6 ether 00:0c:29:58:50:5c txqueuelen 1000 (Ethernet) 7 RX packets 4456 bytes 778847 (760.5 KiB) 8 RX errors 0 dropped 0 overruns 0 frame 0 9 TX packets 2843 bytes 1252178 (1.1 MiB) 10 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 11 12 eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 13 ether 00:0c:29:58:50:66 txqueuelen 1000 (Ethernet) 14 RX packets 41 bytes 3228 (3.1 KiB) 15 RX errors 0 dropped 0 overruns 0 frame 0 16 TX packets 4881 bytes 813878 (794.8 KiB) 17 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 18 19 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 20 inet 127.0.0.1 netmask 255.0.0.0 21 inet6 ::1 prefixlen 128 scopeid 0x10<host> 22 loop txqueuelen 1000 (Local Loopback) 23 RX packets 0 bytes 0 (0.0 B) 24 RX errors 0 dropped 0 overruns 0 frame 0 25 TX packets 0 bytes 0 (0.0 B) 26 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
route -n 检查网关是否生效,查看是否有默认路由
1 [21:36:18 root@Centos7 ~]#route -n 2 Kernel IP routing table 3 Destination Gateway Genmask Flags Metric Ref Use Iface 4 0.0.0.0 10.0.0.2 0.0.0.0 UG 100 0 0 eth0 5 10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
查看dns配置是否生效
1 [21:37:49 root@Centos7 ~]#cat /etc/resolv.conf 2 # Generated by NetworkManager 3 nameserver 180.76.76.76 4 nameserver 223.6.6.6
如遇子命令无法补全问题需安装bash-completion软件包

浙公网安备 33010602011771号