TCP(传输控制协议),是一种面向连接的,可靠地,基于字节流的传输层协议。前端常考的要点。
在一个TCP连接上是可以发送多个http请求的,不同的版本这个模式不一样。 在HTTP/1.0中这个TCP连接是在http请求创建的时候同步创建的,http请求发送到服务器端,服务器端响应了之后,这个TCP连接就关闭了; HTTP/1.1中可以以某种方式声明这个连接一直保持,一个请求传输完之后,另一个请求可以接着传输。这样的好处是:在创建一个TCP连接的过程中需要“三次握手”的消耗,“三次握手”代表有三次网络传输。 如果TCP连接保持,第二个请求发送就没有这“三次握手”的消耗。HTTP/2中同一个TCP连接里还可以并发地传输http请求。
TCP三次握手
- 客户端发送SYN报文给服务器端,进入SYN_SEND状态
- 服务器端收到SYN报文,回应一个SYN+ACK包,进入SYS_RECE状态
- 客户端收到服务器端发送的SYN报文,明确了客户端到服务器的数据传输是正常的,结束SYN_SENT,回应服务器端一个ACK报文,表示Established状态
TCP四次挥手
为什么TCP三次握手连接成功,却要四次挥手才能断开连接呢?
这是由于TCP的半关闭造成的。
- 当某个应用进程需要关闭时,该端执行主动关闭(active clsoe),发送一个FIN表示数据发送完毕。
- 另外一段接收到这个FIN,送一个ACK回去。执行被动关闭(passive close),这个FIN由TCP确认。
- 一段时间后,接收到这个文件结束符的应用进程将调用close关闭套接字,这导致它的TCP发送一个FIN,用来关闭的数据初始弄
-
接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。该端收到FIN后,返回ACK。另一端确认完进入关闭状态(CLOSED)
无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。