1.三次握手(数据包)
(初始状态CLOSED)
第一次握手:建立连接时,客户端发送SYN包到服务器,其中同步序列号syn=j。而后客户端进入SYN_SENT状态,等待服务器确认;
第二次握手:服务器被动打开后进入LISTEN状态,在收到客户端SYN包后:①确认客户的SYN包。其中确认标志位ACK=1,确认号ack=j+1;②同时自己也发送一个SYN包。其中同步标志位SYN=1,序列号seq=k。而后服务器进入SYN_RCVD状态;
第三次握手:客户端收到服务器的ACK+SYN包,向服务器发送确认包,确认标志位ACK=1,,确认号ack=k+1。而后客户端和服务器端进入ESTABLISHED状态,TCP连接成功,完成三次握手。
为什么不是两/三次握手?因为服务器端和客户端的数据不是同时发送完,所以无论哪端发送完数据都需要请求并确认。另外两次握手也会导致死锁。
2.四次挥手
TCP客户端发送一个FIN,其中终止标志位FIN=1,序列号seq=u。而后客户端进入 FIN_WAIT_1状态;
服务器收到客户端的FIN后①向客户端发送确认,其中确认标志位ACK=1,,确认号ack=u+1;②同时自己也发送一个序列号seq=1。而后服务器端进入CLOSE_WAIT状态。客户端收到服务器的确认请求后,就进入FIN_WAIT_2状态,等待服务器发送连接释放报文。
服务器将最后的数据发送完毕后就向客户端发送连接释放报文。①其中终止标志位FIN=1,序列号seq=w。②确认终止,确认标志位ACK=1,确认号ack=u+1;而后服务器端进入LAST_ACK(最后确认)状态。
客户端收到服务器端的连接释放报文后,向服务器端发送确认,其中确认标志位ACK=1,确认号ack=w+1,自身序列号seq=u+1。而后客户端进入TIME_WAIT(时间等待)状态,在经过2MSL(最大报文段生存时间)后CLOSE。
(服务器收到客户端确认释放连接报文后立即进入CLOSE状态)
为什么要等待最大报文段生存时间?是为了确认服务器端收到了客户端的确认释放连接报文,如果在等待的时间内客户端又收到了FIN,则表明在网络传输过程中丢失了ACK报文,之前没有确认成功。
为什么是四次挥手不是三次?关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能像三次握手一样一起发送确认ACK和终止FIN。
3.TCP和UDP
区别:
TCP是面向连接的、可靠的、端到端的传输层协议;
UDP对应的则是可靠性要求低、传输流量大,传输速度快的应用。
应用场景:
TCP:当对网络通讯质量有要求使使用,如互联网和企业网上的客户端应用,金融领域。TCP支持的应用协议有远程登录协议Telnet、文件传输协议FTP等;
UDP:当强调传输性能而不是传输的完整性时使用,如QQ使用的是UDP协议聊天,因为用户不需要等待就会接收。UDP支持的应用层协议有域名系统DNS、通用文件传输协议TFTP等
TCP为什么可靠?因为三次握手、超时重传、滑动窗口、拥塞控制
什么是面向连接?在发送消息前先建立连接,并在通信过程中实时监控和管理连接情况。非面向连接则直接发送数据。