9. 总结TCP包头结构,TCP三次握手,四次挥手?
答:
TCP包头部结构:
TCP协议的首部前20个字节是一些固定的字段,这前20个字节之后有一段可选字段也称为选项,长度可变;
(1).前4个字节是源端口字段和目标端口字段,每个字段2个字节;
(2).序号==>seq占用4个字节;因为序号是4个字节,所以它能编号的范围是0到2^32-1;当序号增加到2^32-1之后,下一个序号将又重新绕回到0开始编号。编号的方式是每个分包的起始字节号,例如第一次要发送的数据分包编号是seq=1,如果这次发送的数据长度是len=10个字节,则下个分包的编号是seq=11,依次类推;
(3).确认号(ack)占用4个字节,它是等待发送方发送的下个数据包的起始字节,接收方收到分包之后,将会给发送方发送一个确认ack包,用于告知发送方下一个要发送的分包将从此序号开始,例如接收方接收到了前100个字节,此时如果要发送确认包,则ack=101;另一方面,当发送方接收到确认包的ack=101,这已经表明接收方已经明确接收到了前100个字节的数据;
(4).数据偏移占4个bit位,它用来确认TCP数据段距离首部多长,换句话说,可以根据该字段知道TCP的数据部分的起始位置;之所以有这个字段,主要是因为TCP首部前20个字节之后还有可选字段,这个可选字段的长度是不确定的;
(5).保留字段,目前还未定义功能的字段,占用6个bit位;
(6).URG位,占用1个bit位,其值为0或1,当为1时表示这是紧急数据,需要尽快发送,而不是按照原来的编号顺序传输;
(7).ACK位,占用1个bit位,其值为0或1,当为1时,表明前面的ack确认号字段才是有效的,当为0时,则表示确认号ack无效;TCP要求,连接建立完成后,ACK字段总是设置为1;
(8).RST位,占用1个bit位,其值为0或1,当为1时,表明需要重新建立TCP连接,所以这会导致先释放连接;当RST=1时,这可能是因为连接出现了差错,或者其他一些原因导致的;
(9).SYN位,占用1个bit位,其值为0或1,用于同步编号;当SYN=1, 而ACK=0时,说明连接尚未建立,所以这是一个TCP的连接请求,如果对方接受请求连接,则回复时将设置SYN=1且ACK=1。SYN会在连接建立后设置为0,所以SYN=1表示这是TCP连接建立前的请求或响应包,此时应结合ACK即可判断是还是响应;
(10).FIN(finish),占用一个bit位,其值为0或1,当FIN为1时,则表明请求释放TCP连接;
(11).窗口,占用2个字节,所以其范围是0到2^16-1,窗口用于告知对方,从本TCP报文中的确认号开始,允许发送方发送多少数据,这个字段的意义是为了保证接收速度变慢时,让发送方的速度也缓慢下来,否则接收方的缓存存放不下,接收方可能随时会动态调整窗口值,从而让发送方也能动态按需发送一定量的数据;
(12).校验和,占用2个字节,该字段会对TCP首部和TCP数据部分都做校验;
(13).紧急指针,占用2个字节,紧急指针只有在URG设置为1时才有意义,该字段指出紧急数据的字节数;
(14).可选字段,这部分是固定20字节之后的,长度可变;
TCP三次握手:
首先服务端B的服务进程已经监听在某个端口上,监听之后就可以一直等待客户端请求建立TCP连接;
(1).当客户端A想要和服务端B建立连接时,首先会发送一个连接请求报文给服务端B;在这个请求报文中,TCP首部中的SYN位设置为1,ACK位设置为0,假设此时的序号是x(序号不一定是1),即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表示的是占用一个bit位的ACK的设置位,而ack是确认号,这个包通常被称为ACK包,当服务端B发送完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连接就建立完成。
TCP四次挥手:
首先客户端与服务端在开始释放TCP连接之前,都已经处于ESTABLISHED的状态,假设客户端A开始前期释放连接:
(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, 发送完这个回复包之后,服务端进入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的时长以后,将真正关闭连接。
12. 201.222.200.111/18 计算主机数?子网掩码?说明计算方法
答:201.222.200.111/18的网络位是18位,则其主机数=2^14 - 主机位全为0的情况 - 主机位全为1的情况 = 2^14 - 2 = 2^10*2^4 - 2 = 1024*16 - 2 = 16384-2=16382,因为IPV4地址总共有4个字节组成,每个字节的范围是0~~255,也就是8个bit位,而且201.222.200.111/18其网络位是18位,那么从左向右的前2个字节已经占了16bit位,再向第3个字节取2位,则可以得出其子网掩码为 255.255.(128+64).0 ==>255.255.192.0
13. 当A(10.0.1.1/16)与B(10.0.2.2/24)通信,A如何判断是否在同一个网段?A和B能否通信?
答:先用A的IP地址和A的子网掩码相与(&)操作,得出结果1为:10.0.0.0;
再用B的IP地址和A的子网掩码相与(&)操作,得出结果2为:10.0.0.0;
则比较结果1和结果2的值,结果1和结果2相等,以A的角度看,A和B是处于同一网段。
接着再以B的IP地址和B的子网掩码相与(&)操作,得出的结果3为:10.0.2.0
然后再以A的IP地址和B的子网掩码相与(&)操作,得出的结果4为:10.0.1.0
结果3和结果4的并不相同,所以综上所述:A和B不能通信。
14. 如何将10.0.0.0/8划分成32个子网?求每个子网的掩码和主机数?
答:2^5 = 32,所以将10.0.0.0/8划分成32个子网,应在原有的基础上,再向主机位借5位;
即每个子网的掩码为: 255.11111 000.0.0 ==>255.(255 - 7).0.0 ==>255.248.0.0
每个子网的主机数:2^(32 - 13) - 2 = 2^19 - 2 = 2^14*2^5 - 2=16384*32 - 2=524286
15.通过网络配置命令,让主机可以上网:
通过nmcli connection show查看当前主机上的旧的网卡信息;
用mcli connection delete 旧网卡的UUID
新增加一个新的网卡,其con-name为eth0, 其对应的网卡名为eth0
nmcli connection add type ethernet con-name eth0 ifname eth0
给新添加的网卡配置IP地址,子网掩码,DNS,网关
nmcli connection modify eth0 \
ipv4.method manual \
ipv4.addresses 192.168.60.11/24 \
ipv4.gateway 192.168.60.254 \
ipv4.dns 8.8.8.8
autoyes
16. 解析/etc/sysconfig/network-scripts/ifcfg-eth0的配置格式:
答:该文件的主要配置内容如下:
DEVICE:此配置文件应用到的设备,也是显示名称,必须与/sys/class/net/目录下的某个网卡名相同;
HWADDR: 对应设备的MAC地址;
BOOTPROTO: 激活此设备时使用的地址配置协议,常用的有dhcp, static, none, bootp;
NM_CONTROLLED: NM是Network-Manager的简写,表示此网卡是否接受NM的管理, Centos6建议设置为 no;
ONBOOT: 在系统启动时是否激活此设备,可选值为yes或者no, 如果设置为no,则需要手动启动;TYPE:设定接口的类型,常见的类型有==》ethernet 和bridge;
UUID: 设备唯一的标识;
IPADDR: 设备的IP地址;
NETMASK: 子网掩码;
GATEWAY: 设定的默认网关;
DNS1: 设定的第一个DNS服务器指向;
DNS2:设定的第二个DNS服务器指向;
PEERDNS:设置为yes时,此文件设置的DNS将覆盖/etc/resolv.conf, 若BOOTPROTO的值是"dhcp"时,则此项默认为 yes,所以dhcp的dns也会覆盖/etc/resolv.conf;
PEERROUTES: 设置为yes时,DHCP设置的路由将覆盖route-ethX文件中的永久路由信息;
DEFROUTE: 设置为yes时,DHCP将设置默认路由;
18.通过ifconfig命令取到ip地址:
答:ifconfig eth0 | sed -rn '2s#(.*inet )([0-9].*)(netmask.*)#\2#p'