tcp
服务端回复完SYN+ACK之后,就建立连接
1.为什么是三次,而不是两次?服务端回复完SYN+ACK之后,就建立连接
这是为了防止因为已失效的请求报文,突然又传到服务器引起错误
意思就是:假设采用两次握手建立连接,客户端向服务端发送了一个SYN包来请求建立连接,因为某些未知原因,并没有到达服务器,在中间的某个网络节点产生了滞留,为了建立连接客户端会重发SYN包,这次的数据包正常发送,服务端恢复SYN+ACK之后建立起了连接,但是第一包数据阻塞了网络节点。突然恢复,第一包SYN又发送到服务端,这是服务端会认为是客户端又发起了一个新的连接,从而在两次握手之后进入等待数据状态。服务端认为是两个连接 而客户端认为是一个连接,造成的状态不一致。(其实二次握手就可以建立链接,三次握手是为了防止丢包的链接被服务端等待(syn~ask~ask)
四次挥手是因为服务端有未发送完的数据。所以需要服务端连续发两次。同时客户端最后的等待也是为了确保服务端收到ASK请求fin~ask~fin~ask
如果过了等待时间则认为服务端已经关闭(没有关闭的话会有ASK))
如果是三次握手的情况下,服务端收不到最后的ACK包,自然不会认为连接建立成功,所以三次握手,本质上就是为了解决网络信道不可靠问题。为了能在不可靠的信道上建立起可靠的连接。
经过三次握手之后,客户端都进入数据传输状态,
2.为什么是四次挥手
处于连接状态的客户端和服务端都可以发起关闭连接请求,此时需要四次挥手来进行连接关闭
假设客户端主动发起连接关闭请求,它需要向服务端发起一个FIN包,表示要关闭连接,自己进入终止等待1状态,这是第一次挥手,服务端收到FIN包,发送一个ACK包,表示自己进入了关闭等待状态,客户端进入终止等待2 状态,这是第二次挥手,服务端此时还可以发送未发送的数据,而客户端还可以接受数据,待服务端发送完数据之后,发送一包FIN包,进入最后确认状态,这是第三次挥手,客户端收到之后恢复AKC包,进入超时等待状态,进入超时等待后关闭连接,而服务端收到ACK包后,立即关闭连接,这是第四次挥手。
为什么客户端需要等待超时时间?
为了保证对方已收到ACK包,因为假设客户端发送完最后一包ACK包后就释了连接,一旦ACK包在网络中丢失,服务端将一直停留在最后确认状态,
如果在客户端发送最后一包ACK后,如果等待一段时间后,这时服务端因为没有收到ACK包会重发FIN包,客户端会响应这个FIN包,重发ACK包并刷新超时时间
这个机制跟三次握手一样,也是为了保证在不可靠的网络链路中,进行可靠的连接断开确认,
udp协议
udp协议是基于非连接的,发送数据就是把简单地数据包封装以下,然后从网卡发出去就可以了,数据包之间并没有状态上的联系
性能损耗少,资源占用也远小于tcp
但是在网络传输过程中产生的丢包,udp协议并不能保证,所以udp稳定性弱