ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急) SYN(synchronous建立联机) Sequence Number(顺序号码) Acknowledge Number(确认号码)
? 这是 TCP 建立连接的特殊情况,有时会出现两台机器同时执行主动打开的情况,不过概率非常小,这种情况大家仅作了解即可。在这种情况下就无所谓发送方和接收方了,双放都可以称为客户端和服务器,同时打开的过程如下:
? 建立一个连接需要三次握手,而终止一个连接要经过 4次握手。这由 TCP 的半关闭( half-close) 造成的。既然一个 TCP 连接是全双工 (即数据在两个方向上能同时传递), 因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向连接。当一端收到一个 FIN,它必须通知应用层另一端已经终止了数据传送。理论上客户端和服务器都可以发起主动关闭,但是更多的情况下是客户端主动发起。
【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
【问题3】为什么不能用两次握手进行连接?
答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
? 现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
TCP/IP协议是一个协议簇。里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TCP、IP协议是两个很重要的协议,就用他两命名了。
TCP/IP协议集包括应用层,传输层,网络层,网络访问层。
TCP的包头结构:
源端口 16位;
目标端口 16位;
序列号 32位;
回应序号 32位;
TCP头长度 4位;
reserved 6位;
控制代码 6位;
窗口大小 16位;
偏移量 16位;
校验和 16位;
选项 32位(可选);
这样我们得出了TCP包头的最小长度,为20字节。
UDP的包头结构:
源端口 16位
目的端口 16位
长度 16位
校验和 16位
区别如下:
1、基于连接与无连接;
2、对系统资源的要求(TCP较多,UDP少);
3、UDP程序结构较简单;
4、流模式与数据报模式 ;
5、TCP保证数据正确性,UDP可能丢包;
6、TCP保证数据顺序,UDP不保证。
以0开头的地址,子网掩码为8位,范围:0.0.0.0-127.255.255.255,网络数量126(不能是0和127),可分配的ip数量2^24-2,私有地址10.0.0.0/8
以10开头的地址,子网掩码为16位,范围:128.0.0.0-191.255.255.255,网络数量214,可分配的ip数量216-2,私有地址172.16.0.0/12
以110开头的地址,子网掩码为24位,范围:192.0.0.0-223.255.255.255,网络数量2^21,可分配的ip数量254,私有地址192.168.0.0/16
以1110开头的地址,组播地址,范围:224.0.0.0-239.255.255.255
以1111开头的地址,为保留地址
第一种使用ifconfig命令配置网卡的ip地址。此命令通常用来零时的测试用,计算机启动后,ip地址的配置将自动失效。具体用法如下:
Ifconfig ethx ipaddr netmask x.x.x.x
注意:此方法配置的ip地址后计算机重启后将会失效。
[23:08:48 root@centos7 data]#nmcli connection add type ethernet con-name eth3 ifname eth1
[23:10:03 root@centos7 data]#nmcli connection modify eth3 ipv4.addresses 192.168.1.135/24
[23:11:16 root@centos7 data]#nmcli connection modify eth3 ipv4.method manual ipv4.gateway 192.168.1.1 ipv4.dns 223.5.5.5
[23:12:33 root@centos7 data]#nmcli connection show
NAME UUID TYPE DEVICE
eth0 5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03 ethernet eth0
virbr0 1544fc04-8ea9-4db2-ad80-01e7469cb8cc bridge virbr0
eth3 2de21499-0f01-4c0b-a585-49dafd4ead6c ethernet - eth1
[23:12:38 root@centos7 data]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
NAME=eth0 #用命令看到的名字
DEVICE=eth0 #设备名
ONBOOT=yes #网卡是否允许启动
BOOTPROTO=static #如果是dhcp 此处需要修改
TYPE=Ethernet #网络类型,以太网
IPADDR=192.168.44.130 #多个IP地址 需要加1 IPADDR1
PREFIX=24 #掩码 也可以写为 NETMASK 255.255.255.0
GATEWAY=192.168.44.2 #网关
dns1=192.168.1.1 #DNS 最多两个
原文:https://blog.51cto.com/8683332/2536704