写在前面:本文章是针对《计算机网络第七版》的学习笔记

运输层1——运输层协议概述

运输层2——用户数据报协议UDP

运输层3——传输控制协议TCP概述

运输层4——TCP可靠运输的工作原理

运输层5——TCP报文段的首部格式

运输层6——TCP可靠传输的实现

运输层7——TCP的流量控制和拥塞控制

运输层8——TCP运输连接管理

TCP是面向连接的协议。运输连接有三个阶段:建立连接、数据传输以及释放连接。TCP连接的建立采用客户服务器的方式。主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器。

1. TCP的连接建立

TCP建立连接的过程叫做握手,握手需要在客户和服务器之间交换三个TCP报文段,也叫三报文握手。

如图:

  • 假定A是客户,B是服务器,最初TCP的两端都是关闭状态,然后A主动打开,B被动打开;

  • 一开始,B的TCP服务器先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务就处于LISTEN状态,等待客户的连接请求;

  • A也是先创建TCB模块,在打算建立TCP连接时,向B发送连接请求报文段,这时首部同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN报文段不携带数据但是要消耗一个序号,这时客户进程进入到SYN-SENT(同步已发送)的状态;

  • B收到A的连接请求报文段后,如果同意建立连接,则向A发送确认。设置SYN=1,ACK=1,确认号ack=x+1,并且设置初始序号seq=y。这个报文段也不携带数据但是消耗一个序号。这时TCP服务器进入到SYN-RCVD(同步收到)的状态;

  • TCP客户进程收到B的确认后,还要向B发送确认。ACK=1,seq=x+1,ack=y+1。此时的ACK报文段可以携带数据,但如果不携带数据则不消耗序号下一个报文段的序号仍是seq=x+1。此时TCP连接已经建立,并且客户进程进入到ESTABLISHED(连接已建立)的状态;

  • B收到A的确认后,也进入到ESTABLISHED的状态。

为什么A还要发送最后一次确认呢?

这是防止已失效的连接请求报文段突然又传送到了B而引发错误。

失效的连接请求:A第一次先发送了一个请求,但是丢失了,于是A再发送一个连接请求,重新建立连接,发送数据并释放连接。

但是有可能出现异常情况,即A发送的连接请求并没有丢失,而是滞留了在网络中。如果在传输数据完成之后,这个请求又发到B,B误以为A还要发送数据,因此发送确认报文,但是A没有运输需求,因此不予理睬。如果没有最后一次确认,B一直等待A的确认,这样会造成的浪费。

采用三报文握手,如果B没有收到A的确认,则可以知道A没有建立连接的需求,就可以避免上述这种情况。

2. TCP的连接释放

如图:

  • A和B目前都处于ESTABLISHED状态,A的应用进程向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。此时,FIN=1,seq=u,u等于前面已发送的最后一个字节的序号加1。这时A进入到FIN-WAIT-1(终止等待1)状态,等待B的确认。FIN报文段即使不携带数据,也要消耗一个序号;

  • B收到释放连接后立即发出确认,此时,ACK=1,确认号是ack=u+1,序号seq=v,v等于B前面所有已传送数据的最后一个字节的序号加1。B进入到CLOSE-WAIT(关闭等待)状态,TCP服务器进程向高层应用进程告知,此时A到B的连接已经释放,TCP连接处于半关闭状态。但是,B到A这个方向的连接尚未关闭;

  • A收到B的确认后,就进入到FIN-WAIT2(终止等待2)的状态,等待B发送连接释放报文段;

  • 若B已经没有数据需要发送,则应用进程通知TCP释放连接,这时B发送的报文段:FIN=1,ACK=1,seq=w(可能后面又发送了一些数据),ack=u+1,并且这个报文消耗一个序号。B进入到LAST-ACK(最后确认)的状态,等待A的确认;

  • A收到B的确认后,必须对此发送确认报文。该报文中:ACK=1,seq=u+1,ack=w+1。然后进入到TIME-WAIT(时间等待)状态。

  • 此时TCP连接并没有完全释放,必须经过时间等待计时器设置的时间2MSL之后,A才进入CLOSED状态。时间MSL叫做最大报文段寿命。

那么,为什么要等待2MSL的时间呢?

  1. 保证A最后发送的ACK报文段能够到达B。因为这个报文可能丢失,因此B会重传最后一个确认报文段,A再重新发送确认报文,并且重启计时器,直到A,B都能正常进入到CLOSED状态;

  2. 防止上面提到的“已失效的连接请求报文”。这段时间内,这些连接请求报文就可能在网络中消失。

此外,B要比A先进入CLOSED状态。

运输层8——TCP运输连接管理的更多相关文章

  1. 三报文握手 四报文握手 TCP运输连接管理

    三报文握手 四报文握手  TCP运输连接管理

  2. TCP的运输连接管理

    TCP的运输连接管理 TCP是面向连接的协议,有三个阶段:连接建立.数据传送 和 连接释放.运输连接的管理就是使运输连接的简历和释放都能正常地进行. 在TCP连接建立过程中要解决一下三个问题: 1.  ...

  3. TCP传输连接管理

    TCP传输连接管理 一.传输连接的三个阶段 1.1.概述 传输连接就有三个阶段,即:连接建立.数据传送和连接释放. 连接建立过程中要解决以下三个问题: 要使每一方能够确知对方的存在. 要允许双方协商一 ...

  4. 计算机网络-5-10-TCP运输连接管理

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

  5. 【TCP】连接管理

    TCP连接管理   本节将介绍一条TCP连接是如何建立和拆除的.此处假设客户机A上面的一个进程想要和服务 器B上的一个进程建立一条TCP连接.本文前面介绍的是比较正常的连接和拆除,特殊的会在后面介绍. ...

  6. TCP的连接管理

    创建连接:(三次握手) 第一步: 客户端向服务器发送一个报文,该报文不含有数据段,SYN=1,随机产生sequence number(随机产生可用于避免某些安全性攻击) 第二步: 服务器收到报文,为这 ...

  7. linux内核参数调优,缓冲区调整,tcp/udp连接管理,保持,释放优化,gossary,terms

    changing a readonly file (linu single user mode)

  8. 运输层4——TCP可靠运输的工作原理

    目录 1. 停止等待协议 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3--传输控制协议TCP概述 运输层4- ...

  9. 运输层5——TCP报文段的首部格式

    写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3--传输控制协议TCP概述 运输层4--TCP可靠运输的工作原理 ...

随机推荐

  1. ELK之Kibana的可视化监控报警插件sentinl的配置

    参考:https://www.bbsmax.com/A/gGdXbgXmJ4/ https://www.deathearth.com/333.html  https://www.cnblogs.com ...

  2. VUE 多页面打包webpack配置

      思路:多配置一个main的文件,用于webpack入口使用, 然后路由的导向也应该默认指向新组件,最后通过webpack构建出一个新的独立的html文件. 缺点:生成多个html会new出多个vu ...

  3. 为做个程序员英语字典,我处理了StackOverflow和HackerNews10年5千万条数据

    有点标题党,不过都说都真实的.英语技能对开发员人员至关重要.所有人都不喜欢背单词,但更惨的是背住的单词发现没怎么用,又慢慢地忘记了.本来计划给自己做个开发人员常用单词表,感觉可能对其它人也有用,所以就 ...

  4. [BJOI2019] 奥术神杖 [取log+AC自动机+dp]

    题面 传送门 思路 首先,看到这个乘起来开根号的形式,应该能想到用取$\log$的方式做一个转化: $\sqrt[n]{\prod_i a_i}=\frac{1}{n}\sum_i \log_b a_ ...

  5. UMl类图基本认识

    1.基本认识 1) UML——Unified modeling language UML (统一建模语言), 是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果2) ...

  6. Ansible安装配置及命令使用详解

    Ansible和saltstack目前市面上一些其它的项目管理工具有很大的不同,它的设计初衷就是为了更方便.快捷的进行配置管理.它易于安装和使用.语法也非常简单易学.你可以用Ansible将平常复杂的 ...

  7. java properties文件转义字符和中文乱码解决

    properties文件的分隔符是   =或者 : 第一次出现的就是分割符,第二次出现的也不需要转义,也即是(忽略掉[],只是着重描述字符) [\=]     [\:]   或者  [=]  [:] ...

  8. 030 Android 第三方开源下拉框:NiceSpinner的使用+自定义Button样式+shape绘制控件背景图+图片选择器(selector)

    1.NiceSpinner下拉框控件介绍 Android原生的下拉框Spinner基本上可以满足Android开发对于下拉选项的设计需求,但现在越来越流行的下拉框不满足于Android原生提供的下拉框 ...

  9. 链表习题(1)-设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点

    /*设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点*/ /* 算法思想:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点, 则显然有f(L->next,x)的 ...

  10. Redis--list类型操作命令

    列表 list Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列 表的头部(左边)或者尾部(右边) 列表 list——基本命令 lpush 语法:lpush key valu ...