TCP/IP详解学习笔记(13)-- TCP连接的建立与终止_tcp连接建立和释放捕获图_big_bit的博客-程序员秘密

技术标签: linux 网络编程  tcp  udp  

1.TCP连接的建立
     
     设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请求,然后服务进程就处于听的状态。不断检测是否有客户进程发起连续请求,如有,作出响应。设客户进程运行在主机A中,他先向自己的TCP发出主动打开的命令,表明要向某个IP地址的某个端口建立运输连接,过程如下:
     1)主机A的TCP向主机B的TCP发出连接请求报文段,其首部中的同步比特SYN应置1,同时选择一个序号x,表明在后面传送数据时的第一个数据字节的序号是x。
     2)主机B的TCP收到连接请求报文段后,如同意,则发挥确认。在确认报文段中应将SYN置为1,确认号应为x+1,同时也为自己选择一个序号y
     3)主机A的TCP收到此报文段后,还要向B给出确认,其确认号为y+1
     4)主机A的TCP通知上层应用进程,连接已经建立,当主机B的TCP收到主机A的确认后,也通知上层应用进程,连接建立。
 
2.TCP连接的释放
     
     在数据传输完毕之后,通信双方都可以发出释放连接的请求。释放连接的过程为如上图所示:
     1)数据传输结束后,主机A的应用进程先向其TCP发出释放连接请求,不在发送数据。TCP通知对方要释放从A到B的连接,将发往主机B的TCP报文段首部的终止比特FIN置为1,序号u等于已传送数据的最后一个字节的序号加1。
     2)主机B的TCP收到释放连接通知后发出确认,其序号为u+1,同时通知应用进程,这样A到B的连接就释放了,连接处于半关闭状态。主机B不在接受主机A发来的数据;但主机B还向A发送数据,主机A若正确接收数据仍需要发送确认。
     3)在主机B向主机A的数据发送结束后,其应用进程就通知TCP释放连接。主机B发出的连接释放报文段必须将终止比特置为1,并使其序号w等于前面已经传送过的数据的最后一个字节的序号加 1,还必须重复上次已发送过的ACK=u+1。
     4)主机A对主机B的连接释放报文段发出确认,将ACK置为1,ACK=w+1, seq=u+1。这样才把从B到A的反方向连接释放掉,主机A的TCP再向其应用进程报告,整个连接已经全部释放。
 
3.注意的问题
  • 三次握手建立连接时,发送方再次发送确认的必要性
    • 主要是为了防止已失效的连接请求报文段突然又传到了B,因而产生错误。假定出现一种异常情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,一直延迟到连接释放以后的某个时间才到达B,本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了,这样一直等待A发来数据,B的许多资源就这样白白浪费了。
  • 四次挥手释放连接时,等待2MSL的意义
    • 第一,为了保证A发送的最有一个ACK报文段能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN和ACK报文段的确认。B会超时重传这个FIN和ACK报文段,而A就能在2MSL时间内收到这个重传的ACK+FIN报文段。接着A重传一次确认。
    • 第二,就是防止上面提到的已失效的连接请求报文段出现在本连接中,A在发送完最有一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。
4.TCP的有限状态机
     连接的建立和释放所要求的步骤可以用一个有限状态机来表达,该状态机有11种状态。每一种状态中都存在一些合法的事件,当合法事件发生的时候,可能需要采取某个动作。当其他事件发生的时候,则报告一个错误。

状 态

描 述

CLOSED

关闭状态,没有连接活动或正在进行

LISTEN

监听状态,服务器正在等待连接进入

SYN RCVD

收到一个连接请求,尚未确认

SYN SENT

已经发出连接请求,等待确认

ESTABLISHED

连接建立,正常数据传输状态

FIN WAIT 1

(主动关闭)已经发送关闭请求,等待确认

FIN WAIT 2

(主动关闭)收到对方关闭确认,等待对方关闭请求

TIMED WAIT

完成双向关闭,等待所有分组死掉

CLOSING

双方同时尝试关闭,等待对方确认

CLOSE WAIT

(被动关闭)收到对方关闭请求,已经确认

LAST ACK

(被动关闭)等待最后一个关闭确认,并等待所有分组死掉

TCP建立与释放的变迁如图所示:

 

 

  • 客户进程变迁的过程(粗实线)
    • 连接建立:设一个主机的客户进程发起连接请求(主动打开),这时本地TCP实体就创建传输控制快(TCB),发送一个SYN为1的报文,进入SYN_SENT状态。当收到来自进程的SYN和ACK时,TCP就发送出三次握手中的最后一个ACK,进而进入连接已经建立的状态ESTABLISHED。
    • 连接释放:设运行客户进程主机本地TCP实体发送一个FIN置为1的报文,等待着确认ACK的到达,此时状态变为FIN_WAIT_1。当运行客户进程主机收到确认ACK时,则一个方向的连接已经关闭。状态变成FIN_WAIT_2。当运行客户进程的主机收到运行服务器进程的主机发送的FIN置为1的报文后,应响应确认ACK时,这是另一个连接关闭。但此时TCP还要等待一段时间后才删除原来建立的连接记录。返回到初始的CLOSED状态,这是为了保证原来连接上的所有分组都从网络中消失了。
  • 服务器进程变迁的过程(粗虚线)
    • 连接建立:服务器进程发出被动打开,进入监听状态LISTEN。当收到SYN置为1的连接请求报文后,发送确认ACK,并且报文中的SYN也置为1,然后进入SYN_RCVD状态。在收到三次握手最后一个确认ACK时,就转为ESTABLISHED状态。
    • 连接释放:当客户进程的数据已经传送完毕。就发出FIN置为1的报文给服务器进程,进入CLOSE_WAIT状态。服务器进程发送FIN报文段给客户进程,状态变为LAST_ACK状态。当收到客户进程的ACK时,服务器进程就释放连接。删除连接记录。回到原来的CLOSED状态。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/big_bit/article/details/52596719

智能推荐

python加权求和_python求加权平均值的实例(附纯python写法)_weixin_39812224的博客-程序员秘密

python求加权平均值的实例(附纯python写法)首先是数据源:#需要求加权平均值的数据列表elements = []#对应的权值列表weights = []使用numpy直接求:import numpy as npnp.average(elements, weights=weights)附纯python写法:# 不使用numpy写法1round(sum([elements[i]*weight...

python 3.8.1 百度网盘下载_python安装包百度云_张朝阳的博客的博客-程序员秘密

链接:https://pan.baidu.com/s/17r7r2Gq1hnTD74Bywdyg-w提取码:jjc1

华为 MA5680T 配置_weixin_34354945的博客-程序员秘密

在MA5680T上配置:telnet到MA5680T>>User name:root>>User password:adminMA5680T>enableMA5680T#configMA5680T(config)#sysname Ueusiuee_MA5680T //修改系统名,根据实际设备修改Ueusiuee_MA5680...

「雕爷学编程」Arduino动手做(8)——湿度传感器模块_weixin_30348519的博客-程序员秘密

37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备逐一做做实验,不管能否成功,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉。【Arduino】66种传感器模块系列实验之八:湿度传感器模块湿敏电阻是...

arcgis语言如何中文改英文_值得收藏|不重装软件实现ArcGIS中英文版本之间切换..._Michael Ding的博客-程序员秘密

概述相信大家在使用ArcGIS的过程中遇到过这样的情况:为了方便自己的使用,往往会给自己的ArcGIS安装中文语言包,使软件显示为中文,但是当出现对于某一不是很熟悉的操作需要去网上查阅资料时,发现网上的大部分资料对菜单或者工具的名称描述使用的是英文,手上中文的软件和网上英文的教程比较难以对应上。再或者当输出地图的时候,因为安装了中文语言包,某些内置的模板的某些标识显示为中文,但是出图要求显示为英文...

GAN最新进展:8大技巧提高稳定性_一只tobey的博客-程序员秘密

1.替代损失函数 (Alternative Loss Functions) 针对 GAN 的缺陷,最常用的一种修复方法是Wasserstein GAN。它本质上用Earth Mover distance(Wasserstein-1 distance 或 EM distance) 来替代传统 GAN 的Jensen Shannon 散度。EM 距离的原始形式是难以处理的,因此我们使用它的 ...

随便推点

android 加载动画素材,【AE教程】教你用Lottie实现App加载动画_黑科技玩机的博客-程序员秘密

@Olaf_Chou 更加简便和高质量的还原 App 动效前言在没有 Lottie 之前,一般都是通过给 PNG 序列图,或者是开发自己写,当然这些动画一般都是比较简单的,如果遇到复杂的动画,开发一般都会拒绝掉,理由一般都是这个没法实现,这个动画需要很多时间,版本迭代周期紧,这个版本没法实现了,要不以后有空给你看看吧。不过自从有了 Lottie,再也不用担心了,一般的动画开发都能高效快速的给你高保...

连续微小线段速度前瞻规划算法_速度前瞻算法_Galaxy_Robot的博客-程序员秘密

连续微小线段速度前瞻规划算法研究现状速度前瞻规划是指预先分析后续路径,获取路径长度和速度约束条件等信息,并根据这些信息进行自适应速度调整,从而尽可能地提高加工速度。速度前瞻规划可以有效地缩短加工时间,减小机床振动,保护刀具以及提高加工质量,是保证速度平稳性和提高加工效率的重要途径,也是机床实现高速高平稳加工的一个不可或缺的过程。速度前瞻规划是高速高平稳数控系统必不可少的算法,部分国外、国内数控系统应用速度前瞻的情况分别如下表所示。复杂型面的数控加工普遍采用CAM编程,这时型面通常会被逼近成大量小线

向量点积、叉积的意义_叉积大于0代表什么_yingfeng2的博客-程序员秘密

向量点积、叉积的意义1.向量点积意义①二维向量A和B点积(结果为标量)定义为:A.dot(B) = |A|*|B|*cos(a)比较重要的用途(数学意义)为:②得到向量夹角。(根据cos(a)计算得到)③得到对应单位分量上的长度。(当向量B为单位向量时,则|A|*cos(a)表示向量A在向量B上的单位分量)可用于凸多边形的碰撞检测(分

STM32串口空闲中断,中断标志位无法清除_胖茄子的博客-程序员秘密

今天想使用STM32的串口空闲中断作接收,调了1个小时,发现串口空闲中断无法被清除,网上搜索半天发现,能用清除的库函数清除该中断。我又回头看了一下手册。果真如此,问题已解决[这是该文章链接](https://www.ruitz.cn/?p=202)![这是官方手册介绍](https://img-blog.csdnimg.cn/20200401081634631.png?x-oss-proces...

Centos7.3安装和配置Tomcat8_java程序员劝退师的博客-程序员秘密

Centos7.3安装和配置Tomcat8第一步:下载Tomcat8压缩包进入 http://tomcat.apache.org/download-80.cgi**第二步:创建目录上传文件1.在/home下新建tomcat目录2.用FinalSheet工具把压缩包上传到/home/tomcat/下第三步:解压[[email protected] ~]# cd /home/tomcat[...

Log4j的配置与使用详解_weixin_30439031的博客-程序员秘密

作者:李天炜Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。原文链接:http://tianweili.github.io/blog/20...

推荐文章

热门文章

相关标签