TCP之连接的建立和终止
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 选项。
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 连接终止的四次挥手
- 某个应用进程首先调用 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
TCP之连接的建立和终止的更多相关文章
- TCP连接的建立和终止
TCP的简要要说明 标签(空格分隔): TCP 网络编程 Linux 面试 在此输入正文 一.TCP是什么 TCP全称传输控制协议(Transmission Control Protocol).TCP ...
- 传输层(2)-TCP连接的建立和终止、TIME_WAIT状态
1.TCP连接的建立和终止 1)三路握手 客户端发送一个SYN(同步)分解,告诉服务器客户将在连接中发送的数据的初始序列号. 服务器发送确认客户的SYN(ACK),同时自己也得发送一个SYN分节,它含 ...
- TCP连接的建立与终止
TCP/IP详解学习笔记(13)-- TCP连接的建立与终止 1.TCP连接的建立 设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请 ...
- [TCP/IP]TCP连接的建立和终止
TCP 是支持全双工通信的传输层协议,为了开发出更好的网络通信应用,清楚了解其中的交互过程是非常必要的. 下面用比较直白的话来描述&理解一下这个过程: TCP 连接建立:三次握手 服务器依次调 ...
- TCP/IP协议--TCP协议概括和TCP连接的建立和终止
TCP提供一种面向连接的.可靠的字节流服务.面向连接指,发送和接收方在交换数据前必须建立一个TCP连接.顺便说下,一个TCP连接只有两方,因此广播和多播是不能应用于TCP的.字节流指,两个应用程序通过 ...
- TCP连接的建立与终止过程详解
TCP连接的建立与终止: 1.TCP连接的建立 设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请求,然后服务进程就处于听的状态.不断检测是否有客 ...
- 网络编程-TCP连接的建立与终止
TCP是一个面向连接的协议.无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接. 1.建立连接 请求端(通常称为客户)发送一个 SYN 段指明客户打算连接的服务器的端口,以及初始序号( I ...
- TCP的连接和建立 图解
前言 在没有理解TCP连接是如何建立和终止之前,我想你可能并不会使用connect,accept,close这三个函数并且使用netstat程序来调试应用.所以掌握TCP连接的建立和终止势在必行. 三 ...
- TCP/IP详解学习笔记(13)-- TCP连接的建立与终止
1.TCP连接的建立 设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请求,然后服务进程就处于听的状态.不断检测是否有客户进程发起连续 ...
随机推荐
- Hive SQL查询效率提升之Analyze方案的实施
0.简介 Analyze,分析表(也称为计算统计信息)是一种内置的Hive操作,可以执行该操作来收集表上的元数据信息.这可以极大的改善表上的查询时间,因为它收集构成表中数据的行计数,文件计数和文件大小 ...
- logback替换log4j
1.新建logback.xml放在src目录下(放在src下会自动加载,不需要再web.xml配置) 2.引入必要的jar包:
- WebStorm 使用技巧
常用快捷键 代码编辑 ctrl + d:复制行 ctrl + y:删除行 ctrl + x:剪切行 ctrl + shift + ↑: 行移动 ctrl + shift + enter: 换行 ctr ...
- ztree树id、pid转成children格式的(待整理完整)
山铝菜单 因为菜单选用了bootstrap treeview ,而格式需要是children类似的格式 var nodes = [ {name: "父节点1", children: ...
- Delphi 图形组件(Shape)
樊伟胜
- Intellij IDEA导入java项目看不到左边的项目目录结构
1 重新import项目 然后导入完成,就可以了,再不行的话,删除.idea文件,重新import整个Project
- task_struct原码解读
该结构体在linux中的路径为如下,如果是本地也可以根据以下子目录找到task_struct结构体,该结构体源码中在600多行 https://github.com/torvalds/linux/bl ...
- 异步消息处理机制相关面试问题-handler面试问题详解
什么是handler? 这个异常应该也就是引出handler的原因,也就是默认在非UI线程中是无法去更新UI的东东滴,那到底什么上handler呢? handler通过发送和处理Message和Run ...
- UVA 1482 SG打表
打出SG表来可以很容易的发现i为偶数时 SG[i]=i/2 i为奇数时 SG[i]=SG[i/2] #include<bits/stdc++.h> typedef long long ll ...
- 201871010101-陈来弟《面向对象程序设计(java)》第十七周学习总结
实验十七 线程同步控制 实验时间 2018-12-10 第一部分:理论知识 1.多线程并发执行中的问题 ◆多个线程相对执行的顺序是不确定的. ◆线程执行顺序的不确定性会产生执行结果的不确定性. ◆在 ...