TCP连接的建立和释放

概述

  TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程,运输连接有三个阶段:连接建立数据传送连接释放

TCP连接的建立

  

  如图所示,假定A主机是客户端程序,B主机是服务端程序。最初两端的TCP进程都是出于CLOSED(关闭)状态。

  (1)B的TCP服务器进程先创建传输控制块TCB(transmission Control Block),准备接受客户进程的连接请求。然后服务器就进入LISTEN(监听)状态,等待客户端的连接请求。

  (2)A的TCP客户进程也是首先创建传输控制块TCB,然后向B发出连接请求报文段,这是首部中的同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN报文段不能携带数据,但是要消耗掉一个序号。这是TCP客户进程进入SYN-SENT(同步已发送)状态

  (3)B收到连接请求报文段后,如果同意建立连接,则向A发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号ack=x+1,同时也为自己选择一个初始序号seq=y。这个报文段也不能携带数据,但同样要消耗掉一个序号。这时TCP服务器进入SYN-RCVD(同步收到)状态

  (4)TCP客户京城收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。TCP标准规定,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。这时TCP连接已经建立了,A进入ESTABLISHED(已建立连接)状态。

  疑问:

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

    假定出现这样一种情况,即A发出第一个连接请求报文段在某些网络节点长时间滞留了,以致延误到连接释放以后的某个时间才达到B。本来这是一个早已失效的报文段。但B收到此失效的连接请求报文段后,就误认为是A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。假定不采用三次握手,那么只要B发出确认,新的连接就建立了。

TCP连接的释放

  

  如图所示,数据传输结束后,通信双方都可释放连接。现在A和B都处于ESTABLISHED状态。

  (1)A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1。这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。TCP规定,FIN报文段即使不携带,也要消耗一个序号

  (2)B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1。然后B就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP出于半关闭(half-close)状态,即A已经没有数据要发送了,但B若发送数据,A仍要接收。也就是说,从B到A这个方向的连接并未关闭,这个状态可能会持续一段时间。

  (3)A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。

  (4)若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN=1。假定B的序号为w(在半关闭状态可能又发送了一些数据)。B还必须重复上次已发送过的确认号ack=u+1。这时B就进入LAST-ACK(最后确认)状态,等待A的确认。

  (5)A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack=w+1,而自己的序号是seq=u+1,然后进入到TIME-WAIT(时间等待状态)。此时,连接并没有释放,必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入到CLOSED状态时间MSL叫做最长报文段寿命

  疑问

    为什么A在TIME-WAIT状态必须等待2MSL时间呢?

    (1)为了保证A发送的最后一个ACK报文段能够达到B。这个ACK报文段有可能丢失,因而使处在LASK-ACK状态的B收不到对己方发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着A重传一次确认,重新启动2MSL计时器。最后,A和B都正常进入到CLOSED状态。

    (2)防止已失效的连接请求报文段,A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。

  保活计时器(keepalive timer)

  客户端的主机突然出了故障。线程,服务器以后修不能再接受客户发来的数据。服务器不能白白等下去。这就是使用保活计时器。服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是2个小时。若两个小时没有收到客户的数据,就每隔75分钟发送一次探测报文段。若发送10个探测报文段后扔无反应,服务端就认为是客户端出了问题,接着就关闭了这个连接。

TCP连接测试

  测试工具:Linux服务器,Tomcat服务器,浏览器客户端。

  测试结果及分析:

    (1)Linux服务器启动Tomcat服务器,Tomcat服务器默认监听8080端口。

    

    (2)使用Tcpdump -X TCP port 8080 对8080端口进行监听

    

    (3)在对TCP开始分析之前,先贴出TCP报文段的头部格式

    

    (4)使用浏览器访问Tomcat服务器,对TCP进行分析,第一次握手

   

    对于上述头部分析:seq序号为9ee1 38a3,此时的ack确认号为0,数据偏移(TCO首部长度)+保留+标记位为a002,转换为二进制得1010000000000010,对照上面的首部格式,可以分析出SYN同步位置1,其余标记位都为0.

    (5)第二次握手 

    此时,seq序号为3d36 f797,ack确认号为9ee1 38a4,对于上一次的请求x=seq,这次的确认号ack=x+1。数据偏移(TCO首部长度)+保留+标记位为a012,转换为二进制得1010000000010010,可以分析得ACK=1,SYN=1。

    (6)第三次握手

    

    此时,seq序号为9ee1 38a4,ack确认号为3d36 f798,对于上一次的请求y=seq,这次的确认号ack=y+1,而这次的seq还是为x+1。数据偏移(TCO首部长度)+保留+标记位为8010,转换为二进制得1000000000010000,可以分析得只有ACK还在置1。

计算机网络(11)-----TCP连接的建立和释放的更多相关文章

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

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

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

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

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

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

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

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

  5. tcp连接的建立与释放

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

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

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

  7. TCP 连接的建立和释放

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

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

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

  9. TCP/IP详解学习笔记(13)-- TCP连接的建立与终止

    1.TCP连接的建立            设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请求,然后服务进程就处于听的状态.不断检测是否有客户进程发起连续 ...

随机推荐

  1. UVA 10795 新汉诺塔问题

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. Cheatsheet: 2016 08.01 ~ 08.31

    .NET Getting Started with ASP.NET Core and VS Code Coding Standard Best Practices In C# Wire – Writi ...

  3. Js零散知识点笔记

    1.将类数组对象转换为数组 ES5: var arrLike = document.querySelectorAll('span'); var arr = Array.prototype.slice. ...

  4. UTF-8 ->GBK

    /** * GBK->UTF8 */ //方法一 旧方法 //NSString *encode1 = [@"%E6%88%91" stringByReplacingPerce ...

  5. sqllite 入门

    链接: http://www.jb51.net/article/52064.htm

  6. IOS判断设备是否已越狱

    转自:http://www.cnblogs.com/supercheng/archive/2012/12/05/2804166.html - (BOOL)isJailbroken { BOOL jai ...

  7. 【网络】IP地址格式转换(htonl、ntohl;inet_addr、inet_ntoa)

    1.htonl ()和ntohl( ) u_long PASCAL FAR ntohl (u_long netlong); u_short PASCAL FAR ntohs (u_short nets ...

  8. Hibernate连数据库

    1.建数据库,建表(一定要设主码) create database Hibernate create table Students( sno char(10) primary key, sna cha ...

  9. MySQL DCL 整理

    DCL(Data Control Language)数据库控制语言  授权,角色控制等GRANT 授权REVOKE 取消授权

  10. 第二章 NIO入门

    传统的同步阻塞式I/O编程 基于NIO的非阻塞编程 基于NIO2.0的异步非阻塞(AIO)编程 为什么要使用NIO编程 为什么选择Netty 第二章 NIO 入门 2.1 传统的BIO编程 2.1.1 ...