1.什么是TCP
TCP全称Transmission Control Protocol(传输控制协议),是一种面向连接的、可靠的、基于字节流的传输层通信协议。是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。
关键信息:
1)面向连接
2)可靠的
3)基于字节流
4)传输层协议
5)端到端
TCP的三次握手和四次挥手是分别发生在建立连接和断开连接的过程中。
2.为什么需要三次握手
前面我们提到说TCP是面向连接的,那么显然通信的双方如果想进行对话(数据交互)首先需要“建立连接”。那么问题来了,如何确认通信双方是否建立连接了呢?TCP“三次握手”开始登场了。
请欣赏如下TCP三次握手经典图例:(客户端请求服务端获取数据)
1.第一次握手:客户端首先向服务端发送请求,tcp报文头中发送标识SYN=1(SYN表示客户端请求跟服务端建立连接),序号Seq=x。
2.第二次握手:服务端在接收到客户端发送的请求之后,需要告诉客户端已收到请求,tcp报文头中发送标识SYN=1,ACK=1(SYN表示服务端请求跟客户端建立连接,ACK表示对客户端的连接请求进行应答),序号Seq=y,确认号=x+1(表示对客户端发送的序号Seq=x的请求进行确认)。
3.第三次握手:客户端在接收到服务端发送的请求和确认信息之后,同样需要告诉服务端已收到信息,tcp报文头中发送标识ACK=1(ACK表示对服务端的连接请求进行应答),序号Seq=x+1,确认号Ack=y+1(表示对服务端发送的序号Seq=y的请求进行确认)
当三次握手都成功的时候,我们发现此时客户端发送的信息服务端能够收到并且服务端发送的信息客户端也能收到,通信双方连接成功。
这里我们要注意以下两点:
1、图中的发送请求中的发送标识SYN、ACK表示的是发送报文中两个标识位!而Seq和Ack分别代表发送序号和确认号。
2、服务端在接收到了客户端的连接请求后,回复中同时发送了SYN、ACK两个标识位,将建立连接的请求和对客户端的确认应答在同一个数据包中发送了,这也是为什么只需要三次握手,就能建立连接。
WireShark工具抓包演示效果:
3.为什么需要四次挥手
当客户端和服务端之间的数据传输完毕之后,我们就需要释放连接(一直建立连接会浪费资源),那为啥需要四次挥手呢?下面我们结合四次挥手经典图例一起分析下:
1.第一次挥手:客户端向服务端发送断开连接的请求,告诉服务端我这边不需要再请求你的数据了,tcp报文头中发送标识FIN=1(表示客户端请求跟服务端断开连接),序号Seq=u
2.第二次挥手:服务端在接收到客户端发送的断开请求后,需告诉客户端已收到请求,tcp报文头中发送标识ACK=1(ACK表示对客户端的断开连接的请求进行应答),序号Seq=v,确认号Ack=u+1(表示对客户端发送的序号Seq=u的请求进行确认)。
3.第三次挥手:当服务端数据传输完毕之后,向客户端发起断开连接的请求,告诉客户端我这边也不需要再发送数据了,tcp报文头中发送标识FIN=1,ACK=1(FIN表示服务端请求跟客户端断开连接,ACK表示对上一次客户端的断开连接的请求进行应答),序号Seq=w,确认号Ack=u+1(表示对客户端发送的序号Seq=u的请求进行确认)
4.第四次挥手:客户端接收到服务发送的断开连接请求后,需告诉服务端已收到信息,作出应答,tcp报文头中发送标识ACK=1(ACK表示对服务端的断开连接的请求进行应答),序号Seq=u+1,确认号Ack=w+1(表示对服务端发送的序号Seq=w的请求进行确认)
我想说到这里大家都会有几个疑问:
1、第二次挥手的时候。为什么不能像握手的时候一样,服务端对客户端断开连接的请求做确认应答的时候,同时向客户端发送断开连接的请求。这样“三次挥手”不就可以了么???
解答:在实际的网络中,服务端在接收到客户端断开连接的请求的时候,此时服务端可能还有数据没有传输完毕,不能立即向客户端发送断开连接的请求!所以当客户端主动发起断开请求的时候,服务器先回应一个确认,等所有数据传输完毕后再发送服务器断开的请求。
2、在图中我们能看到,客户端的TIME_WAIT状态会持续2MSL再变成CLOSED,MSL(Maximum Segment Lifetime)的中文可以译为“报文最大生存时间”!它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。那这里为什么需要维持2MSL呢?
解答:第4次挥手的时候客户端向服务端发送断开连接的请求的确认ACK,如果客户端发送完成后就直接就关闭连接,如果由于网络原因服务端没有收到ACK,那服务端就没法关闭连接了!因此客户端在回复确认后,还需要等待,万一服务端没有收到应答还会继续发送断开连接的请求;
4.TCP是如何保证可靠传输的
前面我们还说到TCP是可靠的,TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。
简单来说,TCP通过这种通信双方相互应答确认和超时重传的机制来保证传输的可靠性。
感兴趣的同学可以多了解了解,每天丰富自己一点点。