TCP协议通讯流程——三次握手四次挥手

2023-11-09

TCP协议通讯流程(如图)

 

1 服务器的初始化(服务器端)

  • 调用socket,创建文件描述符
  • 调用bind,将当前文件描述符与IP地址跟端口号绑定在一起;如果该端口号已经被其它进程占用了,就会bind失败
  • 调用listen, 声明当前文件描述符为服务器的文件描述符
  • 调动accept,阻塞等待客户端连接

2 建立连接的过程(三次握手)

  • 客户端调用socket,创建文件描述符
  • 客户端调用connect,向服务器端发起连接请求
  • connect会发出SYN段并阻塞等待服务器应答(第一次握手)
  • 服务器端收到客户端的SYN,会应答一个SYN-ACK段,表示“同意建立连接”(第二次握手)
  • 客户端收到SYN-ACK后会从connect返回,同时应答一个ACK段(第三次握手)

这样,这个连接的过程,称为三次握手。

3 数据传输的过程:

  • 建立连接后,TCP协议提供全双工的通信服务
  • 服务器从accept()返回后立刻调用read(),读socket中的数据,如果没有数据就阻塞等待
  • 这时,客户端调用write(),向服务器发送请求,服务器收到请求后read()返回,对客户端请求进行处理,在此期间,客户端调用read阻塞等待服务器应答
  • 服务器调用write将结果发回给客户端,再次调用read阻塞等待下一个请求
  • 客户端收到应答后,read返回,发送下一条请求...

4 断开连接过程(四次挥手)

  • 如果客户端没有请求了,就调用close关闭连接,客户端会向服务器发送FIN段(第一次挥手)
  • 服务器收到FIN段,会回应一个ACK段,同时read返回0(第二次挥手)
  • read返回之后,服务器就知道客户端关闭了连接,也调用close关闭连接,这时服务器也会向客户端发送一个FIN(第三次挥手)
  • 客户端收到FIN,再返回一个ACK给服务器(第四次挥手)

这样,这个断开连接的过程称为四次挥手。

TCP通讯过程中的状态变化

1 服务端状态变化

  • CLOSED -> LISTEN 服务器端调用listen后进入LISTEN 状态,等待客户端连接
  • LISTEN -> SYN_RCVD 一旦监听到连接请求(同步报文段),就将该连接放入内核等待队列中,并向客户端发送SYN确认报文
  • SYN_RCVD -> ESTABLISHED 服务端一旦收到客户端的确认报文,就进入ESTABLISHED状态,连接完成了,可以进行读写了
  • ESTABLISHED -> CLOSE_WAIT 当客户端调用close主动关闭连接时,服务器会收到结束报文段,服务器返回确认报文并进入CLOSE_WAIT状态
  • CLOSE_WAIT -> LAST_ACK   进入CLOSE_WAIT状态说明服务器准备关闭连接(需要处理完之前的数据);当服务器真正调用close关闭连接时,回向客户端发送FIN,服务期进入LASK_ACK状态,等待最后一个ACK的到来
  • LAST_ACK -> CLOSED 服务器收到了最后一个ACK ,就会彻底关闭连接

2 客户端状态变化

  • CLOSED -> SYN_SENT 客户端调用connect,发送同步报文段
  • AYN_SENT -> ESTABLISHED connect调用成功,建立连接,可以进行读写数据
  • ESTABLISHED -> FIN_WAIT_1 客户端调用close,向服务器发送结束报文段,同时进入FIN_WAIT_1
  • FIN_WAIT_1 -> FIN_WAIT_2 客户端收到服务器的确认报文段,进入FIN_WAIT_2,开始等待服务器的结束报文段
  • FIN_WAIT_2 -> TIME_WAIT 客户端收到服务器发来的结束报文段,进入TIME_WAIT, 并发出LASK_ACK
  • TIME_WAIT -> CLOSED 客户端要等待一个2MSL(Max Segment Life,报文最大生存时间)的时间,才会进入CLOSED状态

TIME_WAIT状态的理解

我们在运行一个简单的服务器程序,用一个客户端程序连接上服务器程序,如果此时我们让服务器进程断开连接,又立刻重新启动服务器进程,就会发现启动不了:

这是因为虽然进程终止了,但连接并未完全断开,这时,我们可以用netstat查看网络连接状态:

  • TCP协议规定,主动关闭连接的一方要处于TIME_WAIT状态,等待两个MSL的时间才能回到CLOSED状态
  • 我们使用Ctrl+C结束了server进程,server进程处于TIME_WAIT状态,在TIME_WAIT状态期间不能再次监听同一server端口
  • MSL在RFC1122中规定为两分钟,但是各操作系统的实现不同, 在Centos7上默认配置的值是60s

可以通过下面的方法查看:

为什么TIME_WAIT的时间是2MSL?

1 MSL是TCP报文生存的最大时间,因此TIME_WAIT持续在2MSL的话就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失,否则服务器立刻重启可能会收到上一个进程迟到的数据。

2 同时理论上保证最后一个报文的可靠到达(假设最后一个ACK丢失,那么服务器会重发一个FIN,这是客户端虽然不在了,但TCP连接还在,仍可以重发LAST_ACK)

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP协议通讯流程——三次握手四次挥手 的相关文章

  • 2、TCP、多进程并发、多线程并发(linux网络编程)

    三次握手和四次挥手的过程都是在内核实现的 三次握手 通信的时候不再需要SYN标识位了 只有在请求连接的时候需要SYN标识位 传输数据的时候的随机序号seq就是最近一次对方发送给自己的ACK的随机序号值 而发给对方的ACK就是上次刚刚发给对方
  • 【手把手教你写服务器】客户端程序和服务器程序的简单实现

    文章目录 1 基本TCP客户 服务器程序的套接字函数 2 server c 3 client c 1 基本TCP客户 服务器程序的套接字函数 下图中各个函数的功能 参数及返回值自行查阅 UNIX网络编程卷1 套接字联网API 第4章 2 s
  • Linux网络编程_06_数据链路层MAC帧协议

    Linux网络编程总目录 点击下面链接即可到达对应章节 Linux网络编程 01 网络基础 Linux网络编程 02 socket套接字 Linux网络编程 03 应用层HTTP协议 Linux网络编程 04 传输层UDP和TCP协议 Li
  • 05libevent库下未决与非未决的解释

    05libevent库下未决与非未决的解释 以下是关于libevent学习的相关文章 01libevent库的下载与安装并且测试是否安装成功 02libevent库的整体框架思想 03libevent下通信的主要函数 04libevent库
  • gcc编译器、Makefile

    一 编译程序的基础知识 1 gcc对程序的编译过程 预编译 编译和优化 汇编 链接 预编译 将程序中引用的头文件包含进源代码中 并对宏进行替换 gcc E hello c o hello i 编译 将用户可识别的语言翻译成处理器可识别的汇编
  • 网络编程之IO复用机制(多路IO转接)之epoll_create,epoll_ctl,epoll_wait函数06

    1 epoll create函数 epoll create是创建一个epoll句柄 参数size用来告诉内核监听的文件描述符的个数 跟内存大小有关 include
  • select函数的分析

    select函数位于头文件 include
  • 基于TCP协议的select多路复用IO服务器编程

    一 初识TCP协议 TCP协议是面向链接 可靠的 基于字节流传输层协议 使用严格的应答机制来保证可靠性 1 建立连接时进行三次握手 2 断开连接时进行四次挥手 3 每次发送数据后 都必须要应答 4 会给每个数据包编号 应答时区分编号 TCP
  • 抓包工具Wireshark使用体会

    这两天在工作上遇到了一些问题 必须要用抓包工具来捕获手机端发送过来的数据包 分析其帧结构 以前虽然学习过网络知识 但是也从未接触过抓包工具Wireshark 迫于工作的压力 自己在摸索中学到了一些基本的使用方法 文件格式 pcap 帧排序
  • 关于AF_INET和PF_INET

    AF 表示ADDRESS FAMILY 地址族 PF 表示PROTOCL FAMILY 协议族 Winsock2 h中 define AF INET 0 define PF INET AF INET 所以在windows中AF INET与P
  • Ubuntu 设置时区

    我们要设置成 CST 时区 以保证正确地显示日期 时间 我们常看到的时区有如下几个 PST 美国太平洋标准时间 PST GMT 8 GMT 格林尼治平均时间 等同于英国伦敦本地时间 UTC 通用协调时间 UTC GMT CST 北京时间 北
  • TCP协议通讯流程——三次握手四次挥手

    TCP协议通讯流程 如图 1 服务器的初始化 服务器端 调用socket 创建文件描述符 调用bind 将当前文件描述符与IP地址跟端口号绑定在一起 如果该端口号已经被其它进程占用了 就会bind失败 调用listen 声明当前文件描述符为
  • 信号、signal 函数、sigaction 函数

    文章目录 1 信号的基本概念 2 利用 kill 命令发送信号 3 信号处理的相关动作 4 信号与 signal 函数 4 1 signal 函数示例一 4 2 signal 函数示例二 5 利用 sigaction 函数进行信号处理 6
  • 日志 - 客户端及服务端写法

    一 客户端 先来看一个日志类的实现方法 这个日志类也是代表着大多数客户端日志的主流写法 log h 1 ifndef LOG H 2 define LOG H 3 4 include
  • Linux环境下,安装libevent库

    前言 最近在进行网络编程的学习 在安装libevent库时 遇到了各种各样的问题 最后通过一条条的去搜索问题关键字 费尽千辛万苦 终于完成了安装 也能够成功的运行起来其中所提供的案例代码 所以在这里将各种零碎的问题以及解决方案整理一下 帮助
  • UDP与TCP的对比

    1 报头 1 TCP协议报头 TCP指传输控制协议 其报头格式如下 1 源 目的端口号 表示数据是从哪个进程来 到哪个进程去 2 32位序号 32确认号 用于可靠传输 3 4位TCP报头长度 表示该TCP头部有多少个32位bit 有多少个4
  • 03libevent下通信的主要函数

    03libevent下通信的主要函数 以下是关于libevent学习的相关文章 01libevent库的下载与安装并且测试是否安装成功 02libevent库的整体框架思想 03libevent下通信的主要函数 04libevent库下fi
  • 协议定制 + Json序列化反序列化

    文章目录 协议定制 Json序列化反序列化 1 再谈 协议 1 1 结构化数据 1 2 序列化和反序列化 2 网络版计算器 2 1 服务端 2 2 协议定制 1 网络发送和读取的正确理解 2 协议定制的问题 2 3 客户端 2 4 代码 3
  • 二、Linux网络编程:Socket编程-接口

    2 Socket编程 接口 2 1 接口转换 转接口的换操作主要分为三类 字节序转换操作 IP地址转换操作和主机名转换操作 2 1 1 字节序转换操作 网络序转主机序 函数 含义 作用 ntohs network to host short
  • TCP发送数据流程详解

    B S通信简述 整个计算机网络的实现体现为协议的实现 TCP IP协议是Internet的核心协议 HTTP协议是比TCP更高层次的应用层协议 HTTP HyperText Transfer Protocol 超文本传输协议 是互联网上应用

随机推荐

  • SSO、OAuth2、JWT、CAS、OpenID、LDAP、淘宝微信登录一网打尽

    目录 前言 一 SSO简介 二 OAuth2简介 三 OAuth 2 0 规定了四种获得令牌的流程 1 授权码 Authorization Code 2 隐藏式 Implicit 3 密码式 Resource Owner Password
  • Cache的基本原理以及简单操作

    对于没有接触过底层技术的朋友来说 或许从未听说过cache 毕竟cache的存在对程序员来说是透明的 在接触cache之前 先为你准备段code分析 int arr 10 128 for i 0 i lt 10 i for j 0 j lt
  • 【JavaScript】关于this的代码输出题总结

    1 在Javascript中 this指向函数执行时的当前对象 2 箭头函数时不绑定this的 它的this来自原其父级所处的上下文 3 如果call第一个参数传入的对象调用者是null或者undefined call方法将把全局对象 浏览
  • docker容器里输入python: command not find

    在docker 容器里已经安装好了python包等文件 但是在命令行输入python时出现的是command not find 这是因为没有将包里的python与用户认识的python 建立起来联系 只需要建立软连接即可 ln s opt
  • 使用QNetworkRequest,实现网络连接

    首先要在头文件中包含以下文件 include
  • java解析未知key json_Gson解析JSON中动态未知字段key的方法

    前面一篇文章我介绍了Gson的解析的基本方法 但我们在享受Gson解析的高度封装带来的便利时 有时可能会遇到一些特殊情况 比如json数据中的字段key是动态可变的时候 由于Gson是使用静态注解的方式来设置实体对象的 因此我们很难直接对返
  • 微信小程序开发日记(二)

    一 VSCode开发微信小程序配置 安装插件 minapp 安装插件wechat snippet 安装wxml插件 如何调试 调试遇到两个问题 第一 如何热更新 第二 如何看console 第三 新建页面 新建组件等操作还是微信IDE好一些
  • fetch用英语解释_fetch什么意思_fetch是什么意思中文翻译

    fetch表达的意思有很多种 那么你知道fetch做动词和名词分别都有哪些意思吗 下面学习啦小编为大家带来fetch的英语意思和例句 欢迎大家学习 fetch作动词的意思 取来 抵达 到达 卖得 fetch作名词的意思 拿取 拿来 诡计 风
  • 干预分析模型- China GDP

    干预分析模型 GDP预测 加载pandas matplotlib等包 处理时间序列 import pandas as pd import numpy as np import matplotlib pylab as plt matplotl
  • 谷歌浏览器Chrome和浏览器驱动webdriver的版本对应

    谷歌浏览器Chrome和浏览器驱动webdriver的版本对应 在搞懂这个之前 先来说明几个词 Chrome 浏览器 Selenium 是一个用于浏览器自动化测试的工具集 是一个完整的自动化测试框架 WebDriver 是Selenium的
  • 尚硅谷大数据技术之Flume

    第1章 概述 1 1 Flume定义 Flume是Cloudera提供的一个高可用的 高可靠的 分布式的海量日志采集 聚合和传输的系统 Flume基于流式架构 灵活简单 flume能保证数据的可靠性 但不能保证数据的重复性 1 2 Flum
  • Rides:基本操作与原理

    目录 redis是什么 谁在使用redis 使用redis客户端 redis数据结构 strings lists 集合set 有序集合 哈希 redis持久化 RDB AOF AOF重写 如何选择RDB和AOF 主从 用法 redis是什么
  • APP保活

    APP保活 前言 app保活 在Android中是一种流氓行为 一方面无端浪费用户手机电量 另一方面给用户一种很困惑的感觉 影响用户体验还有可能导致整个Android系统流畅性变差 所以Google官方一种不推荐该功能 也一直在阻止这方面功
  • 最细致的LayUI【前端框架】从入门到实战-快速搭建后台管理系统

    最细致的LayUI 前端框架 从入门到实战 快速搭建后台管理系统 LayUI学习思维导图 和 Bootstrap 有些相似 但该框架有个极大的好处就是定义了很多前后端交互的样式接口 如分页表格 只需在前端配置好接口 后端则按照定义好的接口规
  • 【干货】Android系统定制基础篇:第三部分(Android静默安装、Android支持usb打印机)

    1 Android静默安装 一些产品要求APP在升级时能够实现静默安装 而无需弹出安装界面让用户确认 这里提出两种实现方案 方案一 APP调用 pm 命令实现静默安装 此方案无须修改Android源码 但需要root权限 方案二 修改And
  • ESP32之 ESP-IDF + Clion 开发环境搭建(一)—— Windows版

    本文章 来自原创专栏 ESP32教学专栏 基于ESP IDF 讲解如何使用 ESP IDF 构建 ESP32 程序 发布文章并会持续为已发布文章添加新内容 每篇文章都经过了精打细磨 通过下方对话框进入专栏目录页 CSDN 请求进入目录 O
  • 基于matlab的图解粒度参数计算,基于MATLAB的图解粒度参数计算

    陶瓷材料 第26卷 第3期 2006年8月 热 带 地 理 TROPICALGEOGRAPHY Vol126 No13 Aug 2006 基于MATLAB的图解粒度参数计算 王 为 吴 正 华南师范大学地理系 广州510631 摘 要 粒度
  • Android res文件夹下资源定义及使用

    1 颜色 RGB ARGB RRGGBB AARRGGBB 颜色资源应该位于
  • Android JNI实现锅炉压力显示系统详解

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 第一步创建GuoLu c文件 Created by DELL on 2023 8 13 include
  • TCP协议通讯流程——三次握手四次挥手

    TCP协议通讯流程 如图 1 服务器的初始化 服务器端 调用socket 创建文件描述符 调用bind 将当前文件描述符与IP地址跟端口号绑定在一起 如果该端口号已经被其它进程占用了 就会bind失败 调用listen 声明当前文件描述符为