HTTP:
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。 下面来认识一下TCP
TCP:
传输控制协议(TCP,Transmission Control Protocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议
当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。
TCP是如何建立客户端/服务端可靠的传输呢,下面讲一下他们的伤感的爱情故事
三次握手
三次握手:指建立一个 TCP 连接时,需要客户端和服务器总共发送3次通信。
- 第一次握手([SYN], Seq = x) (你好认识一下)
客户端发送一个SYN标记的包,Seq初始序列号x,发送完成后客户端进入SYN_SEND状态。 - 第二次握手([SYN,ACK], Seq = y, ACK = x + 1) (等你好久了)
服务器返回确认包(ACK)应答,同时还要发送一个SYN包回去。ACK = x + 1,表示确认收到(客户端发来的Seq值 + 1),Seq = y, 表示让客户端确认是否能收到。发送完成后服务端进入SYN_RCVD状态。 - 第三次握手([ACK], ACK = y + 1) (我来了啊)
客户端再次发送确认包(ACK),ACK = y + 1, 表示确认收到服务器的包(服务端发来的Seq值 + 1)。客户端发送完毕后,进入ESTABLISHED状态,服务端接收到这个包,也进入ESTABLISHED状态, TCP握手结束。 - ......没有第四次
为啥不是两次握手,这样无法保证服务端第二次消息客户有没有收到,服务端无法确定是等消息状态还是等数据状态
两次握手对任意一方来说收到一条请求之后就与对方建立链接,如果有请求的数据延迟,后面重发信息建立了链接,通信,释放,如果失效的请求报文一不小心在发送过来,将会建立不必要的链接.
为啥不是四次握手,客户端都已经说要来了,服务端也不能请假呀,那就开始...吧.
四次挥手
- 第一次挥手([FIN], Seq = x)
客户端进程发出连接释放报文,并且停止发送数据。发送完成后,客户端进入FIN_WAIT_1状态。 - 第二次挥手 ([ACK], ACK = x + 1)
服务器收到连接释放报文,发出确认报文,但是还没有准备好。发送完成后,服务端进入CLOSE_WAIT状态,开始处理断开事务,客户端收到这个包后,进入FIN_WAIT_2,等待服务器关闭连接。 - 第三次挥手 ([FIN], Seq = y)
服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,告诉客户端准备关闭了。发送完成后,服务端进入LAST_ACK状态,等待客户端确认。 - 第四次挥手 ([ACK], ACK = y + 1)
客户端收到服务器的连接释放报文后,必须发出确认,进入TIME_WAIT状态,等待服务端可能请求重传的ACK包。
服务端接收到包后,关闭连接,进入CLOSED状态。
客户端在等待两个最大报文生命周期后,没有接收到服务的ACK包,认为服务器已关闭连接,自己也关闭连接,进入CLOSED状态。 - 链接结束.
从三次握手看四次挥手,为什么我了一次信息传输
服务器在第一次连接时,不需要处理客户端的信息事务,可以理解给客户端回复.
在客户端提出断开时,服务端可能还有数据需要向客户端发送,所以先发送收到断开的请求,然后处理后续结尾工作,然后发送处理完成确认断开的信息.然后客户端发确认信息 链接终止.