TCP三次握手和四次挥手
TCP的三次握手(建立连接)和四次挥手(关闭连接)
-
什么是窗口?
-
当建立连接后,两端都会创建一个缓冲区来存储接收的数据,并将缓冲区的尺寸发送给另一端,其中包含了自己的缓冲区的剩余尺寸。窗口就是剩余缓冲区空间的数量。
-
-
tcp
标志位-
SYN(synchronous)
建立连接 -
ACK(acknowledgement)
确认 -
PSH(push)
传送 -
FIN(finish)
结束 -
RST(reset)
重置 -
URG(urgent)
紧急 -
Sequence number
顺序号码 -
Ackonwledge number
确认号码
-
三次握手
-
客户端向服务端发送
SYN
包(SYN = j)
,进入SYN_SEND状态,等待服务器确认 -
服务端收到
SYN
包,向客户端发送SYN+ACK
包,(SYN=K,ACK=j+1)
,此时服务端进入SYN_RECV
状态 -
客户端收到服务端的
SYN+ACK
包,向服务器发送ACK
包,ACK = K+1
,发送完毕后,客户端和服务端进入ESTSABLISHED
状态,完成三次握手
-
SYN
攻击:在三次握手的过程中,服务端发送ACK+SYN
之后,等待客户端发送ACK
的过程中称为半连接,处于Syn_RECV
状态。如果此时攻击客户端在短时间内伪造大量不存在的IP
地址,向服务端不断地发送SYN
包,服务端回复确认包,并等待客户端的确认,由于源地址是不存在的,服务器需要不断重发直至超时,这些伪造的SYN
包将长时间占用未连接队列,正常的SYN
包被丢弃,目标系统运行缓慢,甚至引起网络读书、系统瘫痪。 -
解决:主要方法有
SynAttackProtect
保护机制、SYN cookies
技术、增加最大半连接和缩短超时时间等.
四次挥手
-
发送方向接收方发送
FIN
包,其中包含seq=M
-
接收方收到后,返回一个
ack = M+1,seq = v
-
接收方向发送方发送
FIN
包,其中包含seq=J,ack=M+1
-
发送方接收到后,返回一个
ACK = J+1,seq = m+1
-
关闭连接时,每个方向都要单独执行操作。当一方完成它的数据发送任务后就可以发送一个
FIN
来终止这个方向的连接;收到一个FIN
只意味着这一方向没有数据流动,一个TCP
连接在收到一个FIN
后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
为什么建立连接只需要三次,而关闭连接需要四次?
-
因为建立连接过程中,当服务器收到
SYN+ACK包
后会将自己的SYN+ACK
包一起发送给客户端 -
而关闭连接过程中,当被动方收到
FIN
包后,并不一定被动方向主动方的数据已经发送完毕了,需要等到数据发送完后,再发送FIN
给主动方
为什么TIME_WAIT
状态还需要等2MSL
后才能返回到CLOSED
状态?
-
因为如果网络是不可靠的,不能保证最后发送的
ACK
会被接收到,所以对方可能会超时未收到ACK
,然后重新发送FIN
,此时等待状态就是用来重发可能丢失的ACK
-
服务器不能在短时间内进行相同端口的连接。因此这2MSL也是服务器的平静时间。
- 防止已失效的请求连接报文段出现在网络中,此2MSL的时间将所有请求清空。
为什么不能用两次握手?
-
如果是两次握手,首先客户端向服务端发动连接请求,服务端接收到之后向客户端发送确认应答。如果此时客户端并没有收到服务端的应答,而服务端默认客户端收到了,就会给客户端发送 数据分组,而客户端还在等待应答分组。服务端在发出的数据分组超时后,会重复发送,形成了死锁。
-
如果有某一个请求连接因网络问题被滞后,直到新的连接建立完成后才发送到服务端,此时服务端会以为客户端发起了新的请求,于是会向客户端发送确认报文,此时如果没有客户端进行确认,新的连接就已经建立了,但是客户端不会从这个连接向服务端发送数据,而服务端一直在等待,资源就被浪费了。
TCP
和UDP
的区别?
-
TCP
协议是有连接的,也就是说传输数据之前客户端和服务端必须通过三次握手建立连接,会话结束后也要关闭连接,而UDP
是无连接的 -
TCP
-
TCP
协议所需资源多,TCP
首部需要20个字节,而UDP
为8个 -
TCP
有流量控制和拥塞控制,UDP
没有,网络拥堵不会影响发送端的发送效率 -
TCP
是一对一的连接,而UDP
则可以支持一对一、多对多、一对多的通信 -
TCP
面向的是字节流,UDP
面向的是报文流