TCP连接的建立与终止
一. “三路握手”建立连接
1.服务器(通常通过调用socket、bind、listen来完成——“被动连接”)必须准备接受外来的连接。;
2.客户机(通过调用connect)发起“主动打开”。这将会导致客户TCP发送一个SYN(同步)分节——告诉服务器客户机将在该连接中发送的数据的初始序列号。
3.服务器必须确认(ACK)客户机的SYN(同步),同时服务器自己也发送依个SYN(同步)分节——告诉客户机服务器将在同一连接中发送的数据的初始序列号。(服务器在单个分节中发送SYN和对客户的ACK)
4.客户机也必须确认服务器的SYN。
SYN:同步序号,是TCP建立连接时使用的握手信号
ACK:接收端给发送端的一种传输类控制字符,表示发来的数据已确认接收无误
FIN:TCP终止时使用的挥手信号
1. 第一次握手
客户端给服务器发送一个SYN段(在 TCP 标头中 SYN 位字段为 1 的 TCP/IP 数据包), 该段中也包含客户端的初始序列号(Sequence number = J)。
SYN是同步的缩写,SYN 段是发送到另一台计算机的 TCP 数据包,请求在它们之间建立连接
2. 第二次握手
服务器返回客户端 SYN +ACK 段(在 TCP 标头中SYN和ACK位字段都为 1 的 TCP/IP 数据包), 该段中包含服务器的初始序列号(Sequence number = K);同时使 Acknowledgment number = J + 1来表示确认已收到客户端的 SYN段(Sequence number = J)。
ACK 是“确认”的缩写。 ACK 数据包是任何确认收到一条消息或一系列数据包的 TCP 数据包
3. 第三次握手
客户端给服务器响应一个ACK段(在 TCP 标头中 ACK 位字段为 1 的 TCP/IP 数据包), 该段中使 Acknowledgment number = K + 1来表示确认已收到服务器的 SYN段(Sequence number = K)。
二. TCP选项
MSS选项(Maximum Segment Size,最大报文段大小):TCP发送端使用该选项告诉对方自己所能接受的最大段大小
窗口规模选项:主要指的是 滑动窗口中窗口的规模。TCP连接任何一端能够通告对端的最大窗口大小是65535,因为在TCP首部中相应的字段占16位。
时间戳选项:时间戳选项使发送方在每个报文段中放置一个时间戳值。接收方在确认中返回这个数值,从而允许发送方为每一个收到的ACK计算RTT。这个选项对高速网络连接是必要的,它可以防止由失而复现的分组可能造成的数据破坏。
三. TCP连接终止
1.某个应用进程(通过调用close)发起“主动关闭”,同时该端的TCP会发送一个FIN(结束)分节——表示数据发送完毕。
2.接收到该FIN的对端执行“被动关闭”,并发送ACK确认该FIN。——因为FIN的接收意味着接收端进程在相应连接上再无额外数据可接收,将作为一个文件结束符(EOF)放在已排队等候该应用进程接收的任何其他数据之后。
3.一段时间后,接收到这个文件结束符(EOF——FIN)的进程将调用close关闭它的套接字,并同时也发送一个FIN。
4.接收这个最终FIN的原发送端TCP(执行主动关闭的一端)确认(ACK)这个FIN。
在上述步骤B和C之间,从执行“主动关闭”一端到执行“被动关闭”一端流动数据是可能的(不发送数据了,并不是说也不接收了),这称为“半关闭”。
一个Unix进程无论自愿还是非自愿终止时,所有打开的描述符都被关闭,这就导致仍然打开的任何TCP连接上也发出一个FIN。
无论是客户机还是服务器,任何一端都可以执行主动关闭。(通常由客户机执行主动关闭)
四. TCP状态转换图
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
五. TIME_WAIT状态
执行主动关闭的那端经历TIME_WAIT这个状态,该端停留在这个状态的的持续时间是最长分节生命期的两倍,如上图的2MSL。(MSL是任何IP数据报能够给在因特网中存活的最长时间)
客户 服务器
TIME_WAIT状态存在的两个理由:
A.可靠地实现TCP全双工连接的终止;
如上图,如果TCP打算执行全双工关闭(彻底终止某个连接上两个方向的数据流),那么它必须正确处理终止序列4个分节的任何一个分节丢失的情况。现在我们假设最终的ACK丢失。则服务器将重新发送它的最终那个FIN,因此客户必须维护状态信息,以允许它重新发送最终那个ACK。要是客户不维护状态信息,它将响应一个RST(重置连接、复位连接),这将被服务器解释成一个错误。
因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态 。
B.允许老的(迷途的)重复分节在网络中消逝;
TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。
参考:TCP三次握手详解-深入浅出(有图实例演示)_jun2016425的博客-CSDN博客_tcp三次握手
UNIX网络编程——TCP的连接建立与终止、基本TCP客户/服务器套接字函数_松狮-CSDN博客
TCP连接的建立与终止_程序人生-CSDN博客_tcp连接
#TCP/IP# TCP头部选项功能详解_潇汀-CSDN博客_tcp选项
TCP连接的建立与终止相关推荐
- 【TCP/IP详解 卷一:协议】第十八章 TCP连接 的建立与终止 (2)其余内容
18.5 TCP的半关闭 牢记 TCP 是 全双工 的. 半关闭:TCP提供了连接的一端 在结束了它的发送后 还能接收来自另外一端数据的能力.但是只有很少的应用程序利用它. 为了实现这个特性,编程接口 ...
- TCP/IP传输层协议实现 - TCP连接的建立与终止(lwip)
1.lwip tcp相关数据结构 1.1.tcp报文格式 <TCP-IP详解卷 1:协议>TCP包首部结构如下: 1.2.lwip tcp数据结构 tcp相关数据结构如下,tcp_pcb_ ...
- TCP连接的建立和终止
一.三路握手 二.TCP连接关闭时的分组交换 三.TCP状态转换图 四.TCP连接的分组交换 转载于:https://www.cnblogs.com/soldierback/p/10624130.ht ...
- 网络学习笔记(一):TCP连接的建立与关闭
五层网络模型分为:物理层.数据链路层.网络层.传输层.应用层.其中,传输层有两种主要协议:面向连接的TCP(Transmission Control Protocol 传输控制协议).无连接的UD ...
- TCP连接的建立和中止
TCP连接的建立和中止 文章目录 TCP连接的建立和中止 TCP连接的建立 TCP连接的中止 TCP状态转换图 观察分组 TIME_WAIT状态 参考 理解TCP连接的建立和中止,有助于我们理解con ...
- TCP连接的建立与释放
概述 TCP是一个面向连接的协议.无论哪一方向另一方发送数据前,都必须先在双方之间建立一条连接. 这种两端间连接的建立与无连接协议如UDP不同.一端使用UDP向另一端发送数据报时,无需任何预先的握手. ...
- TCP/IP详解--学习笔记(10)-TCP连接的建立与中止
TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接.这和前面讲到的协议完全不同.前面讲的所有协议都只是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编 ...
- s6-5 TCP 连接的建立
TCP 连接的建立 采用三次握手建立连接 一方(server)被动地等待一个进来的连接请求 另一方(the client)通过发送连接请求,设置一些参数 服务器方回发确认应答 应答到达请求方,请求方最 ...
- TCP/IP之TCP连接的建立与中止状态分析
TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做四次握手. 1.连接的建立: c端发起请求同步(用SYN段等于1的TCP报文),确认某个端口是否监听: s端应答(用ACK段等于1的TCP ...
最新文章
- spring Batch实现数据库大数据量读写
- Rsync和Sersync(企业实时同步方案)
- webpack4.x开发环境配置
- asp.net %% %#%%=%%@%%$%用法与区别
- linux 搭建github,github在linux上的环境搭建-Go语言中文社区
- 简明Vim练级攻略(转)
- 【codevs1282】约瑟夫问题,卡数据ing?
- 使C#代码现代化——第二部分:方法
- 符号级别(一)--基础概念
- 《算法图解》——数组和链表
- Ubuntu 安装arm-linux-gcc编译器
- php1008打印机驱动器,hp laserjet p1008打印机驱动
- C程序设计语言——基础概念
- 计算机丢失boost,Win7系统安装后出现无法开启readyboost怎么办?
- 短视频软件开发,抖音源码,美颜SDK,提供开放API接口
- Mac 安装谷歌浏览器驱动
- 佛蒙特州政府组建工作组以探索区块链技术
- dakai微信小程序 ios_【iOS】微信小程序打开APP到底是怎么回事?
- 【UE4 制作自己的载具】1-使用3dsmax制作载具
- Win11如何关闭自动更新?Win11更新服务关闭教程