一、TCP 三次握手
1、client给server发送syn后,处于SYN_SENT状态,等待server确认,server处于LISTEN状态;
2、server收到syn后,会回复ack确认,同时会发送自己的syn给客户端,请求连接,此时server处于SYN_RECV状态;
3、client收到服务器的syn,也会回复ack,处于ESTABLISHED,server收到ack,状态转变为ESTABLISHED,连接建立成功。
如果是两次握手:
1、client发送syn后,由于网络延时server没收到,client没有收到server的ack,然后重新发送syn,server回复ack,建立连接发送数据后,关闭连接,此时server接收了延时的syn报文,server误以为是新连接,就会确认。
2、第二次握手,server发送的ack,由于网络原因被丢失,client没有接收端ack,会重新发送syn,但是此时server已经处于就绪状态,认为连接已经建立号了。
如果是4次:
1、客户端发送syn;
2、服务器发送ack
3、服务器发送syn
4、客户端发送ack
很明显2、3步可以合并再一起,分别占用自己的包头
二、TCP四次挥手
1、client发送FIN表示自己不再有数据发送,状态为FIN_WAIT_1,
2、server回复ACK,状态变为CLOSE_WAIT,此时可能还有数据没传送完毕,client收到ack后状态变为FIN_WAIT_2,
3、server等传输完,再发送FIN,表示自己没有数据发送,状态变为LAST_ACK
4、client回复ACK后,状态变为TIME_WAIT,2毫秒后置位CLOSE,client接收到ACK后,状态CLOSE
TIME_WAIT存在的意义
1、表示如果server端没有收到ACK,会重新发送FIN,此时还可以接收
三、TCP粘包
1、发送端等缓冲区数据满才发送,TCP为提高传输效率,发送方往往要收集到足够的数据后才发送一包数据,若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包的数据。
2、接收方不及时接收缓冲区的包,接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时,前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区数据,这样就一次取到了多包数据。
TCP 面向连接的流传输,数据是无边界的 ,使用struct模块避免
UDP 不会出现粘包,因为它有消息边界,使得每一个消息都是独立的,
我们连续发送三个数据包,大小分别是2k,4k,8k,这三个数据包,都已经到达了接收端的网络堆栈中,如果使用UDP协议,不管我们使用多大的接收缓冲区去接收数据,我们必须有三次接收动作,才能够把所有的数据包接收完.而使用TCP协议,我们只要把接收的缓冲区大小设置在14k以上,我们就能够一次把所有的数据包接收下来,只需要有一次接收动作。
避免:
1、发送端发送数据的时候将数据的长度告知接收端,然后接收端根据长度接收,但是会造成大量的网络连接,放大网络延时。
2、struct模块可以把要发送的数据长度转换成固定长度的字节,接收端先接收固定长度的字节,就能知道要接收的内容大小。
四、TCP和UDP区别
UDP 优点:快,安全,效率高
缺点:不可靠,会丢包,UDP 泛洪攻击,不断向服务器发送UDP报文
TCP 优点:传输可靠,安全,稳定,确认机制,传输完数据断开连接。
缺点:建立连接、确认机制消耗时间、网络资源、服务器资源,连接过程比较多,中间环节容易被攻击
DOS 拒绝服务
DDOS 分布式拒绝服务
CC 伪装攻击,借助代理服务器生成大量合法请求
滑动窗口
意味接收方还有多大的缓冲区可以用于接收数据,发送方可以通过华东窗口的大小来确定应该发送多少字节的数据,当滑动窗口为0时,发送方一般不能发送数据。
拥塞控制
拥塞现象网络中一部分数据数量过多,导致该部分网络来不及处理,以至于整个网络堵塞受影响