三报文握手

1.概述

TCP是面向连接的协议。TCP建立连接的过程叫做握手,握手需要在客户和服务器之间交换三个TCP报文段,即我们说的“三次握手”(严格讲是一次握手过程中交换了三个报文)。

2.过程

一开始客户端和服务器端中的TCP进程都处于关闭状态,假设客户端主动打开连接,服务器端被动打开连接;这时客户端TCP进程创建传输控制模块TCB,服务器端进程也创建传输控制模块TCB并监听客户请求,以便及时响应。

  • 第一次
    客户端打算建立TCP连接时,向服务器端发送连接请求报文段,其首部中的同步位SYN=1,ACK=0,并选择一个初始序号seq=x,这时客户端TCP进程进入同步已发送状态(SYN-SENT)。
  • 第二次
    服务器端收到连接请求报文段后,如果同意连接,则向客户端发送确认报文段,其首部中的同步位和ACK位都为1,确认号为ack=x+1,并选择一个初始序号为seq=y,这时服务器端TCP进程进入同步已收到状态(SYN-RCVD)。
  • 第三次
    客户端收到服务器端的确认后,还需要向服务器端发送确认报文段,其首部中的同步位和ACK位都为1,确认号为ack=y+1,自己的序号为seq=x+1,这时客户端TCP进程进入已建立连接状态(ESTABLISHED)。

当服务器端收到客户端的确认后,也进入已建立连接状态(ESTABLISHED)。

3.过程图示

4.四报文握手

在三报文握手中的第二次报文发送时,可以先发送一个确认报文段(ACK=1,ack=x+1),再发送一个同步报文段(SYN=1,seq=y),这就变成了四报文握手。

四报文挥手

1.概述

TCP释放连接的过程叫做挥手。挥手需要在客户和服务器之间交换四个TCP报文段。

2.过程

数据传输结束后,通信的双方都可释放连接。假设客户端停止发送数据,先主动关闭TCP连接。

  • 第一次
    客户端TCP进程发送连接释放报文段并进入终止等待1状态(FIN-WAIT-1),其中报文段首部的终止控制位FIN=1,其序号seq=u(u等于已传送过的数据的最后一个字节的序号加1)。
  • 第二次
    服务器端收到连接释放报文段后发出确认报文段并进入关闭等待状态(CLOSE-WAIT),其中报文段首部确认号为ack=u+1,其序号为seq=v(v等同于u)。
    客户端收到服务器端的确认后,进入终止等待2状态(FIN-WAIT-2),等待服务器端发送连接释放报文段。
    这时TCP连接处于半关闭状态,即客户端到服务器端的连接释放了,但是服务器端仍可发送数据,客户端仍可以接收数据。
  • 第三次
    当服务器端停止发送数据,其应用进程会通知TCP释放连接。
    服务器端TCP进程发送连接释放报文段并进入最后确认状态(LAST-ACK),其中报文段首部的终止控制位FIN=1,其序号seq=w(半关闭状态时可能发送了数据),确认号ack=u+1。
  • 第四次
    客户端收到连接释放报文段后发出确认报文段并进入时间等待状态(TIME-WAIT),其中报文段首部的ACK=1,确认号ack=w+1,其序号为seq=u+1。
    此时TCP连接还没有释放,等待时间等待计时器设置的2MSL时间后(建议四分钟),客户端才进入关闭状态。

3.图示

几个问题

  • 1.三报文握手为什么客户端最后还要发送一次确认呢?
    为了防止已失效的连接请求报文段又发给服务器端而产生错误。
    比如客户端发送的第一个请求报文段在某些网络节点滞留了,导致连接释放后的某个时间才到达服务器端,服务器端会向客户端发送确认报文段。
    如果不采用三报文握手,那么新的连接就建立了,但客户端不知道建立了连接,就不会发送数据导致服务器端一直等待;
    而采用三报文握手,客户端不会向服务器端的确认发出确认,服务器端收不到确认,就不会建立连接。
  • 2.为什么四报文挥手客户端在时间等待状态需要等待2MSL?
    其一是为了保证客户端发送的最后一个确认报文段能到达服务器端。因为最后一个ACK报文段可能丢失,服务器端收不到这个报文段会超时重传FIN报文段,在2MSL时间内客户端能收到重传的FIN报文段并重传ACK报文段,保证客户端和服务器端正常关闭TCP连接。
    其二是防止已失效的请求连接报文段出现在本次连接中。客户端在发送完最后一个ACK报文段后经过2MSL时间后,本次连接内的所有报文段将消失,下一次新的连接中就不会有本次的无效的请求连接报文段了。

网络_TCP连接的建立与释放的更多相关文章

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

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

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

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

  3. TCP连接的建立与释放(三次握手与四次挥手)

    TCP连接的建立与释放(三次握手与四次挥手) TCP是面向连接的运输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,HTTP协议 ...

  4. Wireshark-TCP协议分析(包结构以及连接的建立和释放)

    原文:http://blog.csdn.net/ahafg/article/details/51039584 TCP:传输控制协议 TCP是一种面向连接的.可靠的.基于字节流的传输层通信协议.  面向 ...

  5. tcp连接的建立与释放

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

  6. 【网络协议】TCP连接的建立和释放

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/29382883 TCP首部格式 先看TCP报文段的格式,例如以下; TCP报文段首部的前20 ...

  7. TCP连接的建立与释放(超详细)

    前言:在计算机网络协议中,TCP只是其中一个,然而在网络使用中,TCP也是最离不开的协议之一,它的重要性毋庸置疑,最最重要的是,面试的重点就是它啊,呜呜~~,今天我们一起来看下TCP的连接建立与释放, ...

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

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

  9. TCP 连接的建立和释放

    TCP(Transmission Control Protocol) 传输控制协议 1.三次握手协议(建立连接) TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: ...

随机推荐

  1. ps 证件照(1,2寸)

    制作证件照      9*9打印 1,1寸  图片裁剪 2, 2寸 图片裁剪 3,将裁剪完成后的图片选择添加画布  Alt Ctrl  c 将高和宽各加20px  ,背景选择白色 4,将得到的带有白色 ...

  2. html5-progress和meter用法

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  3. 第三方统计分析埋点工具对比,神策、Ptmind、GrowingIO、国双,还有谷歌分析,谁更好?

    第三方统计分析埋点工具对比,神策.Ptmind.GrowingIO.国双,还有谷歌分析,谁更好?https://www.colabug.com/2985393.html GA.Mixpanel 和神策 ...

  4. centos6.8卸载DB2 10.5

    1.卸载实例 Ø  使用Root用户登陆 cd /opt/ibm/db2/V9.5/instance/ ./db2idrop db2inst1 ./dasdrop db2inst1 2.卸载db2 Ø ...

  5. [转载]oracle函数listagg的使用说明

    工作中经常遇到很多需求是这样的,根据条件汇总某些字段,比如我遇到的是,我们公司有三个投资平台,同一个客户拿手机号在三个平台都注册了,但注册过的用户名不一样,显示的时候需要根据手机号显示所有注册过的名称 ...

  6. Autel MaxiSys Elite Diagnostic Tool Common problem solving methods

    1. updating MaxiFlash Elite to firmware 3.21? My maxisys communicate with the MaxiFlash J2534 but Ma ...

  7. asp.net热门框架

    http://developer.51cto.com/art/201501/464292.htm

  8. Django框架----在Python脚本中调用Django环境

    在项目根目录下新建脚本文件script.py import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTI ...

  9. hibernate文档头的不同版本

    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "h ...

  10. K8S学习笔记之CentOS7集群使用Chrony实现时间同步

    0x00 概述 容器集群对时间同步要求高,实际使用环境中必须确保集群中所有系统时间保持一致,openstack官方也推荐使用chrony代替ntp做时间同步. Chrony是一个开源的自由软件,像Ce ...