1. 连接的建立

TCP 连接建立的三次握手


如上图所示,TCP 连接的建立会发生如下述情形:

  1. 服务器必须准备好接受外来的连接。这通常通过调用 socket、bind 和 listen 这 3 个函数来完成,我们称之为被动打开(passive open)。
  2. 客户通过调用 connect 发起主动打开(active open)。这导致客户 TCP 发送一个 SYN(同步)分节,它告诉服务器客户端将在(待建立的)连接中发送的数据的初始序列号。通常 SYN 分节不携带数据,其所在的 IP 数据报只含有一个 IP 首部、一个 TCP 首部及可能有的 TCP 选项。
  3. 服务器必须确认(ACK)客户的 SYN,同时自己也得发送一个 SYN 分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器在单个分节中发送 SYN 和对客户 SYN 的 ACK(确认)。
  4. 客户必须确认服务器的 SYN。

TCP 连接的建立至少需要 3 个分组,因此称之为 TCP 的三次握手(threee-way handshake)。

1.1 TCP 选项

TCP 选项即 TCP 首部中的可选字段。每一个 SYN 可以含有多个 TCP 选项。下面是常用的 TCP 选项。

TCP 选项的格式如下图:

  • 每个选项的开始是 1 字节的 kind 字段,说明选项的类型。kind 字段为 0 和 1 的选项仅占 1 个字节。其他的选项在 kind 字节后还有 len 字节。它说明的长度是指总长度,包括 kind 和 len 字节。
  • 设置无操作选项的原因在于允许发送方填充字段为 4 字节的倍数。

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 连接终止的四次挥手

  1. 某个应用进程首先调用 close,称该端执行主动关闭(active close)。该端的 TCP 于是发送一个 FIN 分节,表示数据发送完毕。
  2. 接收到这个 FIN 的对端执行被动关闭(passive close)。这个 FIN 由 TCP 确认。它的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为 FIN 的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
  3. 一段时间后,接收到这个文件结束符的应用进程将调用 close 关闭它的套接字。这导致它的 TCP 也发送一个 FIN。
  4. 接收这个最终 FIN 的原始发送端 TCP(即执行主动关闭的那一端)确认这个 FIN。

2.1 四次挥手抓包图示

假设是服务器先执行 close,抓到的包如下所示。

S:FIN M

C: ACK M + 1

C: FIN N

S: ACK N + 1

TCP之连接的建立和终止的更多相关文章

  1. TCP连接的建立和终止

    TCP的简要要说明 标签(空格分隔): TCP 网络编程 Linux 面试 在此输入正文 一.TCP是什么 TCP全称传输控制协议(Transmission Control Protocol).TCP ...

  2. 传输层(2)-TCP连接的建立和终止、TIME_WAIT状态

    1.TCP连接的建立和终止 1)三路握手 客户端发送一个SYN(同步)分解,告诉服务器客户将在连接中发送的数据的初始序列号. 服务器发送确认客户的SYN(ACK),同时自己也得发送一个SYN分节,它含 ...

  3. TCP连接的建立与终止

    TCP/IP详解学习笔记(13)-- TCP连接的建立与终止 1.TCP连接的建立            设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请 ...

  4. [TCP/IP]TCP连接的建立和终止

    TCP 是支持全双工通信的传输层协议,为了开发出更好的网络通信应用,清楚了解其中的交互过程是非常必要的. 下面用比较直白的话来描述&理解一下这个过程: TCP 连接建立:三次握手 服务器依次调 ...

  5. TCP/IP协议--TCP协议概括和TCP连接的建立和终止

    TCP提供一种面向连接的.可靠的字节流服务.面向连接指,发送和接收方在交换数据前必须建立一个TCP连接.顺便说下,一个TCP连接只有两方,因此广播和多播是不能应用于TCP的.字节流指,两个应用程序通过 ...

  6. TCP连接的建立与终止过程详解

    TCP连接的建立与终止: 1.TCP连接的建立      设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请求,然后服务进程就处于听的状态.不断检测是否有客 ...

  7. 网络编程-TCP连接的建立与终止

    TCP是一个面向连接的协议.无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接. 1.建立连接 请求端(通常称为客户)发送一个 SYN 段指明客户打算连接的服务器的端口,以及初始序号( I ...

  8. TCP的连接和建立 图解

    前言 在没有理解TCP连接是如何建立和终止之前,我想你可能并不会使用connect,accept,close这三个函数并且使用netstat程序来调试应用.所以掌握TCP连接的建立和终止势在必行. 三 ...

  9. TCP/IP详解学习笔记(13)-- TCP连接的建立与终止

    1.TCP连接的建立            设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请求,然后服务进程就处于听的状态.不断检测是否有客户进程发起连续 ...

随机推荐

  1. nginx 配置反向代理根目录到其他服务器

    location /detail/json { if ( $uri = "/detail/json" ) { rewrite "/detail/json" /i ...

  2. 解决'androidx.arch.core:core-runtime' has different version for the compile (2.0.0) and runtime (2.0.1)

    先说原因,我们引用的包版本不同产生了冲突,所以编译不通过.解决的办法是在引用的时候排除一个版本,只留一个版本. 解决过程: 先找出哪些库引用了相同的库,仅仅是版本不同. gradle app:depe ...

  3. JavaJDBC【二、Mysql包加载与使用】

    连接数据库前提条件是: 1.加载mysql驱动 2.获取连接 加载驱动前需要将mysql的jar包引入项目 Demo: package JDBC; import java.sql.DriverMana ...

  4. 视频大文件分片上传(使用webuploader插件)

    背景 公司做网盘系统,一直在调用图片服务器的接口上传图片,以前写的,以为简单改一改就可以用 最初要求 php 上传多种视频格式,支持大文件,并可以封面截图,时长统计 问题 1.上传到阿里云服务器,13 ...

  5. 怎么处理系统蓝屏后提示代码0x000000d1的错误?

    电脑开机有时会出现蓝屏,导致蓝屏的原因有很多,每种错误都有不同的代码.下面就来和大家分享一下电脑开机蓝屏出现0x000000d1错误代码是什么原因?我们又该怎么去解决这个问题. 电脑开机蓝屏出现0x0 ...

  6. centos 7 源代码搭建部署 zabbix-4.0.13 LTS

    Zabbix 官网 >:https://www.zabbix.com/download 源代码地址>:https://www.zabbix.com/cn/download_sources# ...

  7. nohup命令(Linux终端启动后台运行程序)

    1. nohup指令基本概念: nohup: 不挂断的运行,并没有后台运行功能,用nohup运行命令可以使命令永久执行下去,和用户终端没有关系,断开SSH不影响运行,&是后台运行. nohup ...

  8. 适配器 1、ArrayAdapter 2.SimpleAdapter

    1.ArrayAdapter(数组适配器):用于绑定格式单一的数据.数据源:可以是集合或数组 public class MainActivity extends AppCompatActivity { ...

  9. 2.java多线程_synchronized(Lock)同步

    1.synchronized同步关键词 线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同 操作共享数据.因此为 ...

  10. Loadrunner:管理员权限启动报错“win10 为了对电脑进行保护,已经阻止此应用”

    问题 最近在尝试做性能测试,由于 Loadrunner 必须用管理员身份启动(普通用户权限启动会遇到各种权限不足的问题) 但是用管理员身份启动时,报错了:win10 为了对电脑进行保护,已经阻止此应用 ...