1. 连接的建立
TCP 连接建立的三次握手
如上图所示,TCP 连接的建立会发生如下述情形:
- 服务器必须准备好接受外来的连接。这通常通过调用 socket、bind 和 listen 这 3 个函数来完成,我们称之为被动打开(passive open)。
- 客户通过调用 connect 发起主动打开(active open)。这导致客户 TCP 发送一个 SYN(同步)分节,它告诉服务器客户端将在(待建立的)连接中发送的数据的初始序列号。通常 SYN 分节不携带数据,其所在的 IP 数据报只含有一个 IP 首部、一个 TCP 首部及可能有的 TCP 选项。
- 服务器必须确认(ACK)客户的 SYN,同时自己也得发送一个 SYN 分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器在单个分节中发送 SYN 和对客户 SYN 的 ACK(确认)。
- 客户必须确认服务器的 SYN。
TCP 连接的建立至少需要 3 个分组,因此称之为 TCP 的三次握手(threee-way handshake)。
1.1 TCP 选项
TCP 选项即 TCP 首部中的可选字段。每一个 SYN 可以含有多个 TCP 选项。下面是常用的 TCP 选项。
MSS 选项
发送 SYN 的 TCP 一端使用本选项通告对端它的最大分节大小(Maximum Segment Size)即 MSS,也就是它在本连接的每个 TCP 分节中愿意接受的最大数据量。发送端 TCP 使用接收端的 MSS 值作为所发送分节的最大大小。TCP_MAXSEG 套接字选项可以提取和设置这个 TCP 选项。
窗口规模选项
TCP 连接任何一端能够通告对端的最大窗口大小是 65535,因为在 TCP 首部中 窗口大小 的字段占 16bit。然而当今因特网上业已普及的高速网络连接或长延迟路径(卫星链路)要求有更大的窗口以获得尽可能大的吞吐量。这个新选项指定 TCP 首部中的通告窗口必须扩大(即左移)的位数(0~14),因此所提供的最大窗口接近 1GB(65535 * 2^14)。在一个 TCP 连接上使用窗口规模的前提是它的两个端系统必须都支持这个选项。可以使用 SO_RCVBUF 套接字选项影响这个 TCP 选项。
注:客户端的 TCP 可以作为主动打开的部分内容随它的 SYN 发送该选项,但是只在对端也随它的 SYN 发送该选项的前提下,它才能扩大自己窗口的规模。类似的,服务器的 TCP 只有接收到随客户端的 SYN 到达的该选项时,才能发送该选项。
时间戳选项
这个选项对于高速网络连接是必要的,它可以防止由失而复现的分组可能造成的数据损坏。它是一个较新的选项,也以类似于窗口规模选项的方式协商处理。作为网络编程人员,无需考虑这个选项。
1.2 三次握手抓包图示
C: SYN J
S: SYN K, ACK J+1
C: ACK K+1
2. 连接的终止
TCP 连接终止的四次挥手
- 某个应用进程首先调用 close,称该端执行主动关闭(active close)。该端的 TCP 于是发送一个 FIN 分节,表示数据发送完毕。
- 接收到这个 FIN 的对端执行被动关闭(passive close)。这个 FIN 由 TCP 确认。它的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为 FIN 的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
- 一段时间后,接收到这个文件结束符的应用进程将调用 close 关闭它的套接字。这导致它的 TCP 也发送一个 FIN。
- 接收这个最终 FIN 的原始发送端 TCP(即执行主动关闭的那一端)确认这个 FIN。
2.1 四次挥手抓包图示
假设是服务器先执行 close,抓到的包如下所示。
S:FIN M
C: ACK M + 1
C: FIN N
S: ACK N + 1
原文地址:https://www.cnblogs.com/jimodetiantang/p/9092500.html