前言

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

三次握手

  1. 客户端首先通过调用connect函数发起主动打开(服务器为被动打开),这导致客户端TCP发送一个SYN同步分节(Synchronize Sequence Numbers),告诉服务器将在连接中发送的数据的初始序列号,如图为 J;(SYN分节不携带数据,其所在的IP数据报只含有一个IP首部、一个TCP首部以及可能有的TCP选项)

  2. 服务器需要对客户端的请求进行确认,同时自己也发送一个SYN分节(包含服务器将在同一连接中发送的数据的初始序列号)

  3. 客户端进行确认。

为什么发送加一的序列号呢?因为这是发送这一端所期待的下一个序列号,而且SYN占据一个字节的序列号空间;

四次挥手

在步骤2和步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是又可能,这成为半关闭。

这个图只是展示了客户端执行主动关闭的情况,不过无论是客户端还是服务器端,任何一方都可以执行主动关闭。

TCP状态转换图

在理解了前面的知识以后,再来看总体的状态转换图就会简单很多。

TCP为一个连接定义了11种状态,并且TCP规则规定如何基于当前状态及在该状态下所接收的分节从一个状态转换到另一个状态。

LISTEN :监听来自远方TCP端口的连接请求。
SYN-SENT :在发送连接请求后等待匹配的连接请求。
SYN-RECEⅣED :在收到和发送一个连接请求后等待对连接请求的确认。
ESTABLISHED :代表一个打开的连接,数据可以传送给用户。
FIN-WAIT-1 :等待远程TCP的连接中断请求,或先前的连接中断请求的确认。
FIN-WAIT-2 :从远程TCP等待连接中断请求。
CLOSE-WAIT :等待从本地用户发来的连接中断请求。
CLOSING :等待远程TCP对连接中断的确认。
LAST-ACK :等待原来发向远程TCP的连接中断请求的确认。
TIME-WAIT :等待足够的时间以确保远程TCP接收到连接中断请求的确认。
CLOSED :没有任何连接状态。

TCP连接过程是状态的转换,促使发生状态转换的是用户调用:OPEN,SEND,RECEⅣE,CLOSE,ABORT和STATUS。传送过来的数据段,特别那些包括以下标记的数据段SYN,ACK,RST和FIN。还有超时,上面所说的都会时TCP状态发生变化。

图中粗实线代表的是客户端状态转换,虚线代表的是服务器状态转换。

我们从图中可以发现两种特殊的情况,分别是同时打开和同时关闭,前者发生在两端几乎同时发送SYN并且这两个SYN在网络中交错的情形下,后者发送在同时发送FIN的情形下。

同时打开

很明显,这个连接的过程经历四次数据交换,但是一个典型的连接建立只需要3次。

从状态转换图中可以发现,TCP在遇见这种协议的时候,只会打开一条连接,比如图中是由客户端做主动打开。

同时关闭

在发送程序后则会进入到 FIN_WAIT_1 状态。在收到对端的FIN后,回复一个ACK,会进入CLOSING状态。在收到对端的ACK后,进入TIME_WAIT状态,也就是说,这中间不会在存在半关闭的状态。

推荐

在线画图工具,可以存在谷歌云盘,还可以现场导出图片和PDF

TCP的连接和建立 图解的更多相关文章

  1. TCP之连接的建立和终止

    1. 连接的建立 TCP 连接建立的三次握手 如上图所示,TCP 连接的建立会发生如下述情形: 服务器必须准备好接受外来的连接.这通常通过调用 socket.bind 和 listen 这 3 个函数 ...

  2. 计算机网络(11)-----TCP连接的建立和释放

    TCP连接的建立和释放 概述 TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程,运输连接有三个阶段:连接建立,数据传送和连接释放. TCP连接的建立 如图所示,假定A主机是客户端程序, ...

  3. TCP/IP详解学习笔记(10)-TCP连接的建立与中止

    TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接.这和前面讲到的协议完全不同.前面讲的所有协议都只是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编 ...

  4. tcp连接的建立与释放

    1.TCP是面向连接的协议. 运输连接时用来传送TCP报文的.TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程.因此,运输链接就有三个阶段,即:连接建立.数据传送和连接释放. 在TCP ...

  5. TCP/IP连接状态

    1.建立连接协议(三次握手)(1)客户端发送一个带SYN标志的TCP报文到服务器.这是三次握手过程中的报文1.(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN ...

  6. 第三次作业:使用Packet Tracer分析TCP连接的建立与释放过程

    0 个人信息 张樱姿 201821121038 计算1812 1 实验目的 使用路由器连接不同的网络 使用命令行操作路由器 通过抓取HTTP报文,分析TCP连接建立的过程 2 实验内容 使用Packe ...

  7. TCP连接的建立和终止

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

  8. 简述TCP连接的建立与释放(三次握手、四次挥手)

    在介绍TCP连接的建立与释放之前,先回顾一下相关知识. TCP是面向连接的运输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,H ...

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

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

随机推荐

  1. Hibernate核心配置文件

    Hibernate.cfg.xml是Hibernate操作数据库的核心配置文件 *********************************************** 作用 01.管理实体类的 ...

  2. C# 结构体 枚举类型

    注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianl ...

  3. Linux文件权限及用户管理

    /etc/passwd文件与 /etc/shadow文件/etc/passwd文件/etc/passwd文件主要存放登录名.UID等用户相关信息,用户登录密码存放在/etc/shadow文件中.例子: ...

  4. 修改UITextField的占位文字颜色的三种层次

    层次一:利用富文本 // 描述占位文字属性 NSMutableDictionary *dict = [NSMutableDictionary dictionary] ; dict[NSForegrou ...

  5. html中如何修改选中 用input做的搜索框 的边框颜色

    html中如何修改选中 用input做的搜索框 的边框颜色 如图,当我鼠标选中输入框时,内边框会变成蓝色 我的问题是: 1.如何把蓝色去掉? 2.如何改成别的颜色? 首先感谢 UI设计师提出的需求,解 ...

  6. phpcmsV9静态页面替换动态步骤

    1.先在www目录下找到 phpcms + install_package + phpcms + templates在templates 文件夹里创建个自己的文件夹我弄得是 ceshi 文件夹,在 c ...

  7. 《C++ Primer》读书笔记—第一章 开始

    声明: 文中内容收集整理自<C++ Primer 中文版 (第5版)>,版权归原书所有. 学习一门程序设计语言最好的方法就是练习编程. 1.一个函数的定义包含四个部分:返回类型(retur ...

  8. 纪中集训 Day 4

    今天(其实是昨天)不考试= = 所以就刷题了 = = 早上无所事事,想把几道题刷过却很不爽的全删了 下午觉得不能这样了,把BZOJ 过了两道水的DP (计算几何根本不会啊QAQ) 晚上先水了一题之后, ...

  9. 几分钟看完 flow.ci 全部功能

    从 0 到 1,从邀请式内测到收费上线,flow.ci 经历了十个多月的沉淀与打磨.这期间,flow.ci 工程师们奋力赶工,进行了一系列的大功能更新,Bug 修复,功能优化. 这篇文章记录了 flo ...

  10. Laravel控制器和视图

    控制器,rawSQL,Model controller.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request ...