TCP结构图
三次握手执行过程
第一次握手:客户端发送一个SYN报文,随机产生一个seq = x,此时客户端进入SYN-SENT状态(发送了请求,等待被连接状态). 1.SYN = 1,seq=x. 第二次握手:服务端收到客户端建立连接的请求,发送自己的SYN报文作为应答,生成自己的序列号seq= y,把客户端的序列号加1作为自己ack的值,ack=x+1,此时服务端进入SYN-RCVD(接收到客户端的请求,.并响应客户端的请求,等待被确认) 2:SYN=1,ACK=1,1表示确认收到,seq=y,ack=x+1, 希望对方下一次发送, 从序号x+1开始 第三次握手:客户端收到同意的报文后,向服务端发送了一个确认报文,表示已经收到服务器端的同意连接的报文,把服务端的序列号加1作为ack 的值,发送完客户端进入ESTAB-LISHED状态 3:ACK=1,seq=x+1,ack=y+1
为什么需要三次握手?
第一次握手:客户端发送网络包,服务端收到了。
? 这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。
? 这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务端并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。
? 这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
所以,只有三次握手才能确认双方的接收与发送能力是否正常。
四次挥手
第一次:客户端需要释放连接,所以向服务器端发送是释放连接请求,FIN=1,seq=u,发送完毕客户端进入FIN-WAIT-1(中断等待状态1) 1:FIN=1,seq=u 第二次:服务端收到释放连接请求后,发送ACK报文响应客户端:ACK=1,seq=v,ack=u+1,服务端进入CLOSE-WAIT(关闭等待状态),此时还可以发送数据 2.ACK=1,seq=v,ack=u+1 下次请求序号为u+1 第三次挥手:服务端响应完数据并打算断开请求,向客户端发送释放连接请求:FIN=1,seq=w,ack=u+1,发送完毕后,服务端进入LAST_ACK(最后确认状态) 3:FIN=1,seq=w,ack=u+1 第四次;客户端收到释放连接请求后,向服务端发送一个确认报文,客户端进入TIME-WAIT,并等待2MSL时间,若此时间没有收再次收到服务器端的重发请求(FIN释放连接请求),则进入CLOSED状态. 4.ACK=1,seq=u+1,ack=w+1.
为什么需要四次挥手
对于四次挥手,因为 TCP 是全双工通信,在主动关闭方发送 FIN 包后,接收端可能还要发送数据,不能立即关闭服务器端到客户端的数据通道,所以也就不能将服务器端的 FIN 包与对客户端的ACK 包合并发送,只能先确认 ACK,然后服务器待无需发送数据时再发送 FIN 包,所以四次挥手时必须是四次数据包的交互。
挥手次数比握手多一次,是因为握手过程,通信只需要处理连接。而挥手过程,通信需要处理数据+连接。
四次挥手释放连接时,等待2MSL的意义?
1.保证客户端发送的最后一个ACK报文段能够到达服务端。 为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。 2防止“已失效的连接请求报文段”出现在本连接中 客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。
TCP和UDP的区别
- 连接方式不同。
? TCP需要三次握手建立连接。UDP是无连接的。
? TCP: 需要建立连接之后才能发送消息
? UDP: 只要监听了ip+port, 符合条件的请求就能接收到
- 数据完整性不同。
? TCP是可靠的。UDP不能保证数据完整性的。
- 数据内容类型不同。
? TCP是字节流。UDP是报文,即对字节数据的再次封装。
- 可接收目标主机数量不同。
? TCP是标准的点对点。UDP可以是一对一,一对多,多对多数据传输。
- 首部开销不同。
? TCP首部开销20字节。UDP首部开销8字节。
- 传输效率不同
? UDP比TCP传输效率更高。
|