TCP 三次握手/四次挥手,TCP 长连接与短连接

TCP 三次握手/四次挥手

三次握手

第一次握手:主机 A 发送位码为 syn=1,随机产生 seq number=1234567 的数据包到服务器主机 B,由 SYN=1 知道,A 要求建立联机;

第二次握手:主机 B 收到请求后要确认联机信息,向 A 发 送 ack number=( 主 机 A 的seq+1),syn=1,ack=1,随机产生 seq=7654321 的包;

第三次握手:主机 A 收到后检查 ack number 是否正确,即第一次发送的 seq number+1,以及位码ack 是否为 1,若正确,主机 A 会再发送 ack number=(主机 B 的 seq+1),ack=1,主机 B 收到后确认。
在这里插入图片描述

四次挥手

(1)TCP 建立连接要进行三次握手,而断开连接要进行四次。这是由于 TCP 的半关闭造成的

因为 TCP 连接是全双工的 (即数据可在两个方向上同时传递),所以进行关闭时每个方向上都要单独进行关闭。这个单方向的关闭就叫半关闭。

当一方完成它的数据发送任务,就发送一个 FIN 来向另一方通告将要终止这个方向的连接。

(2)关闭客户端到服务器的连接:首先客户端 A 发送一个 FIN,用来关闭客户到服务器的数据传送,然后等待服务器的确认。其中终止标志位 FIN=1,序列号 seq=u

(3)服务器收到这个 FIN,它发回一个 ACK,确认号 ACK 为收到的序号加 1。

(4)关闭服务器到客户端的连接:也是发送一个 FIN 给客户端。

(5)客户段收到 FIN 后,并发回一个 ACK 报文确认,并将确认序号 seq 设置为收到序号加 1。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
在这里插入图片描述
主机 A 发送 FIN 后,进入终止等待状态,
服务器 B 收到主机 A 连接释放报文段后,就立即给主机 A 发送确认,然后服务器 B 就进入 close-wait 状态,
此时 TCP 服务器进程就通知高层应用进程,因而从 A 到 B 的连接就释放了。此时是“半关闭”状态。
即 A 不可以发送给B,但是 B 可以发送给 A。此时,若 B 没有数据报要发送给 A 了,其应用进程就通知 TCP 释放连接,然后发送给 A 连接释放报文段,并等待确认。
A 发送确认后,进入 time-wait,注意,此时 TCP 连接还没有释放掉,然后经过时间等待计时器设置的 2MSL 后,A 才进入到close 状态。

为什么会有TIME_WAIT状态:

  • 确保有足够的时间让对方收到ACK包
  • 避免新旧连接混淆

TCP / IP 状态

LISTENING(listening)

  • FTP服务启动后首先处于侦听(LISTENING)状态。

ESTABLISHED(established)

  • 建立连接。表示两台机器正在通信。

CLOSE_WAIT

  • 对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT,此时我方要调用close()来使得连接正确关闭。

TIME_WAIT

  • 我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。

SYN_SENT

  • SYN_SENT状态表示请求连接,当你要访问其它的计算机的服务时首先要发个同步信号给该端口,此时状态为SYN_SENT,如果连接成功了就变为 ESTABLISHED。

TCP 长连接与短连接

长连接和短连接使用原因

当网络通信时采用 TCP协议时,在真正的读写操作之前,serverclient之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次挥手,所以说每个连接的建立都是需要资源消耗和时间消耗的。

HTTP的长连接和短连接

HTTP的长连接和短连接本质上是TCP长连接和短连接

在HTTP/1.0中默认使用短连接。

也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接

当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。

而从HTTP/1.1起,默认使用长连接,用以保持连接特性

使用长连接的HTTP协议,会在响应头加入这行代码:Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP数据TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。

Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

TCP—长连接

所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持(不发生RST包和四次挥手)。

连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接(一个TCP连接通道多个读写通信);这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态;

TCP保活功能,保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。

如果客户已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将应远等待客户端的数据,保活功能就是试图在服务器端检测到这种半开放的连接。

TCP—短连接

短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接(管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段);

连接→数据传输→关闭连接;

应用场景

长连接: 多用于操作频繁(读写),点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。

  • 例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

短连接: 像WEB网站的http服务一般都用短链接(http1.0只支持短连接,1.1keep alive 带时间,操作次数限制的长连接),因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源;

如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知。所以并发量大,但每个用户无需频繁操作情况下需用短连好;

猜你喜欢

转载自blog.csdn.net/qq_32727095/article/details/114162028