TCP是面向连接的协议,其数据传输过程分为建立连接、数据传送、释放连接三个阶段。

0 建立连接

建立连接的过程也就是常说的“三次握手”:

  • 客户端向服务器端发送一个SYN报文(SYN=1表示这是一个连接请求或连接接收报文),并随机选取一个起始序号x;
  • 服务器端应答一个SYN报文,同时ACK(确认位)置1【ACK=1时TCP报文段首部中的ack(确认号字段)才有效】,随机选取一个服务器端的起始序号y,并将ack字段设为x+1,表示已经收到客户端发来的SYN报文,期待收到序号为x+1的下一个报文;
  • 客户端应答一个ACK报文,将序号设为x+1,并且ack字段设为y+1,表示已经收到服务器端的SYN报文,期待收到序号为y+1的下一个报文。

    注:序列号seq也称ISN(Initial Sequence Number)



    之所以要采用三次握手机制而不是两次或四次,要从握手机制的目的说起:

    握手主要是为了确认双方的发送、接收能力是否正常,顺带初始化序号seq,为以后的数据传送做好准备,所以:

    第一次握手:服务器收到客户端发来的网络包,服务器就明白客户端的发送能力、服务器的接收能力正常;

    第二次握手:服务器发包,客户端收到后,客户端就明白服务器的发送、接收,客户端的发送、接收都是正常的;

    二次握手后,客户端倒是全明白了,但是服务器端无法确认客户端能否正常接收、服务器是否正常发送,所以两次握手不够;

    第三次握手:服务器收到客户端发送的网络包,服务器确认了自己上次的发送正常、客户端接收也正常,所以四次握手是多余的。

1 补充问题

  • 序列号(ISN)之所以随机生成,是为了避免被攻击(若固定,则下一次传送的ack就显而易见);
  • 前两次握手不可以携带数据,第三次可以携带。第一次握手服务器端接收能力未知,如果携带数据就可能丢失。第二次客户端接收能力未知,如果携带数据也可能丢失。第三次客户端知道服务器接收正常,并且自己已经处于ESTABLISHED状态;
  • 服务器发出SYN报文后,处于SYN-RCVD状态,此时不同的连接请求会被放在半连接队列里,三次握手完成后的连接请求被放在全连接队列里。

2 连接释放

连接释放的过程也就是常说的“四次挥手”:

P.S. 图中以客户端发起释放请求为例

  1. 客户端发送释放请求,将FIN(终止位)置1,表示客户端已经发完数据,请求释放;
  2. 服务器发一个ACK报文,确认号ack为u+1,这时从客户端到服务器的连接被释放,处于半关闭状态
  3. 如果服务器也要断开连接,就向客户端发送连接释放报文(FIN=1);
  4. 客户端发送一个应答报文,序列号seq为u+1,等待一段时间(2MSL)确保服务器收到ACK报文,之后关闭连接。



客户端之所以要等待2MSL时间才关闭,有两个原因:

  • 一旦服务器没有收到ACK报文,服务器就会重发FIN报文,客户端再次收到FIN报文,就知道之前发送的ACK报文丢失,会重置时间等待计时器为2MSL并重传ACK报文。

    如果没有这段等待时间,万一服务器没有正常接收ACK报文,接下来重传的FIN报文段就无法到达客户端,服务器无法正常关闭。
  • 客户端发完最后一个ACK报文,经过2MSL,本次连接产生的报文都会从网络中消失,避免下一次新连接出现本次旧的连接请求报文段。

TCP 3-Way Handshake的更多相关文章

  1. TCP Connection Establishment and Termination

    Three-Way Handshake The following scenario occurs when a TCP connection is established: The server m ...

  2. 基于TCP协议的网络通讯流程

    不多说了,先上个图: 从上面的图中可以看出来,基于TCP协议进行通讯可以大致分成以下几个阶段: 1. 首先是在服务器端, TCP Sever调用socket(), bind(), listen()完成 ...

  3. FW 常见的性能测试工具有: loadRunner/netperf/httperf/apache_ab/Apache JMeter

    常见的性能测试工具有: loadRunner/netperf/httperf/apache_ab/Apache JMeter , 其中loadRunner属于付费软件,所以在这里不做介绍 netper ...

  4. 内网内使用https 和 使用http 建立连接的速度对比

    文字版 使用https httpstat https://10.24.101.14/cwbase/web/Login.aspx --insecure Connected to HTTP/ OK Ser ...

  5. httpstat的简单使用

    httpstat 应该是一个 python 封装后的 curl 工具能够展现 一些客户端连接网站的时间消耗,最近在看tls 感觉挺有用处的 简单学习一下 1. centos7 安装python 和 p ...

  6. The POSIX API/nss/nscd

    https://code.google.com/p/nsscache/wiki/BackgroundOnNameServiceSwitch The POSIX API POSIX is a stand ...

  7. The TCP three-way handshake (connect)/four wave (closed)

    TCP, relative to the SOCKET developers create process and link remove process consists of the TCP/IP ...

  8. TCP Three-way Handshake

    TCP Connection Management Out-of-Order and Duplication(复制) Problem Old segment from previous connect ...

  9. TCP 3-Way Handshake (SYN,SYN-ACK,ACK)

    http://www.inetdaemon.com/tutorials/internet/tcp/3-way_handshake.shtml

随机推荐

  1. js骚操作骂人不带脏

    前言 很多小伙伴们觉得javaScript很简单,下面的这行 javaScript代码可能会让你怀疑人生. (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ...

  2. 奥卡姆剃刀原则在ERP项目的应用

    一向崇信“奥卡姆剃刀原则”,如非必要,绝不新增. 在我所实施的项目中,自定义字段.自定义报表非常少.很极端的一个例子是,曾经有一家工厂,生产打印机的部件,产品百分之百外销. 在项目实施完成,成功上线后 ...

  3. AJ学IOS(53)多线程网络之NSOperation简介

    AJ分享,必须精品 一:简单介绍 1:NSOperation的作⽤使用步骤: 配合使用NSOperation和NSOperationQueue也能实现多线程编程. NSOperation和NSOper ...

  4. JUC强大的辅助类讲解--->>>CountDownLatchDemo (减少计数)

    原理: CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞.其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞), ...

  5. 泛型方法或泛型类中的方法是内部调用、PInvoke 或是在 COM 导入类中定义的。

    泛型基类中引用Api函数定义时static extern,在子类中会提示: 未处理TypeLoadException 泛型方法或泛型类中的方法是内部调用.PInvoke 或是在 COM 导入类中定义的 ...

  6. Mac os Pycharm 中使用Stanza进行实体识别(自然语言处理nlp)

    stanza 是斯坦福开源Python版nlp库,对自然语言处理有好大的提升,具体好在哪里,官网里面都有介绍,这里就不翻译了.下面放上对应的官网和仓库地址. stanza 官网地址:点击我进入 sta ...

  7. 批量重命名脚本(Python)

    便携的批处理脚本,代码如下: import os import sys def rename(): path=input("请输入路径(例如D:/picture):") name= ...

  8. PHP函数:func_num_args

    func_num_args()  - 返回传递给函数的参数数量. 说明: func_num_args ( void ) : int 参数: 无 返回值: 返回传入当前用户定义函数的参数数量. 参考链接 ...

  9. curl book

    curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本. 官方地址 man page 下载页面, ...

  10. mybatis源码学习:插件定义+执行流程责任链

    目录 一.自定义插件流程 二.测试插件 三.源码分析 1.inteceptor在Configuration中的注册 2.基于责任链的设计模式 3.基于动态代理的plugin 4.拦截方法的interc ...