五层网络模型分为:物理层、数据链路层、网络层、传输层、应用层。其中,传输层有两种主要协议:面向连接的TCP(Transmission Control Protocol 传输控制协议)、无连接的UDP(User Datagram Protocol 用户数据报协议)。

  TCP是面向连接的传输层协议,提供点对点的可靠交付服务。TCP是面向字节流的,提供全双工通信,允许连接双方任何时候都能发送数据。

一、TCP数据段

  TCP传送的数据单元是报文段,TCP报文段分为首部与数据两部分,首部的各字段能体现TCP的全部功能。TCP数据报被封在IP数据报里。

  TCP数据段首部格式如下图所示:


  源端口目的端口各占2个字节。网络通信的端点应该是主机中的进程而不是主机,通过网络层提供的IP地址和传输层提供的端口号能够确定唯一的进程。

  序号占4个字节。TCP是以数据字节流的形式传输数据的,字节流中的每一个字节都按顺序进行编号。数据段首部中的序号是指要发送数据字节流中第一个字节的序号。32位的序号可以对4GB的数据进行编号,一般编号是可以复用的,新序号发送时,相同序号的旧数据早已到达终点。

  确认序号占4个字节。是指期望收到对方下一个报文段第一个数据字节的序号。

  数据偏移占4位。数据偏移是指数据段中的数据起始位置距离数据段的起始位置有多远,简而言之,就是数据段首部的长度。一般数据报的首部是20字节,但是可以添加选项,导致首部的长度不确定。数据偏移的单位是32位,4位长度最大表示的数值是15,因此首部最大为60字节。由此可知,首部中选项最大为40字节。

  保留占6位,当前应置为0。

  标志位占6位,用来说明报文段的性质。

1、URG:置为1时,表明紧急指针有效。

2、ACK:置为1时,表明确认序号有效。

3、PSH:置为1时,接收方应该尽快将报文段交给应用层。

4、RST:置为1时,表明重建连接。

5、SYN:建立连接时,用来同步序号。占一个序号。

6、FIN:释放一个连接。占一个序号。

  窗口占2个字节。窗口是指发送方表明自己能接收对方发送的数据量。流量控制通过声明窗口大小来完成。

  校验和占2个字节,校验的范围包括首部和数据两个部分。

  紧急指针占2个字节。只有当URG标志位置为1时才有效。紧急指针是一个正的偏移量,与序号字段一起确定紧急数据最后一个字节的序号,该序号之后的数据就是普通数据。当窗口值为0时,依然可以发送紧急数据。

  选项最长为40字节,如果没有选项,则报文段首部为20字节。最初规定的只有一个选项:最大报文段长度 MSS,之后又陆续添加了窗口扩大选项、时间戳选项、选择确认选项等。

二、建立连接

  TCP是面向连接的协议,在传输数据之前要先建立连接,在数据传输完毕之后要断开连接。TCP连接的建立采取客户服务器方式,主动发起连接的应用程序叫客户,被动等待建立连接的应用程序叫服务器

  TCP连接的建立需要经过三次握手,即在客户与服务器之间交换三个TCP报文段。建立连接的过程如下图所示:


  最初客户进程与服务器进程都处于CLOSED(关闭)状态,然后服务器的TCP进程创建传输控制块TCB,服务器进程处于LISTEN(收听)状态。传输控制块中存储着连接中的一些重要信息,比如:当前的发送和接收序号、TCP连接表、指向发送和接收缓存的指针等。

  客户进程发起连接之前创建传输控制块TCB。建立连接时向服务器发送请求报文,发送初始序号seq=x,同时将SYN标志位置为1。根据TCP规定,SYN数据报不能携带数据,但是要消耗掉一个序号。此时,客户进程处于SYN-SENT(同步已发送)状态。

  服务器进程收到连接请求报文后,如果同意建立间接,则向客户进程发送确认报文。确认报文中的SYN与ACK标志位都置为1。其中首部中的确认序号表示的是期望对方下一个报文段第一个数据字节的序号,因为客户进程发送SYN报文消耗掉一个序号,因此确认报文首部中的确认序号应该是接收到的SYN报文中的序号加1,即ack=x+1。同时发送自身的序号seq=y。此时,服务器进程处于SYN-RCVD(同步收到)状态。

  客户进程收到确认报文后还要向服务器进程发送确认报文。ACK标志位置为1,seq=x+1,ack=y+1。TCP标准规定,ACK报文段可以携带数据,但是不携带数据的话不消耗序号。此时,TCP连接已经建立,客户进程处于ESTABLISHED(已建立连接)状态。

  服务器进程收到客户进程的确认报文后进入ESTABLISHED(已建立连接)状态。

  之所以需要客户再次发送确认报文,主要是为了防止失效的连接请求报文突然又发送到服务器进程。比如:用户发送请求报文A,因网络原因长期滞留了。超时之后用户重新发送请求报文B,顺利建立连接。之后报文A到达服务器进程,服务器进程发送确认报文,但是用户认为并没有发送连接请求,因此不予理会。此时如果没有第三次握手的机制,服务器进程就会认为连接已经建立,并且一直等待客户进程发来数据,白白浪费很多资源。

三、关闭连接

  数据传输完毕之后,通信双方都可以主动释放连接。为行文方便,以客户主动释放连接为例。关闭连接过程如下图所示:

1、关闭连接四次握手过程

  客户进程数据传输完毕后,发出释放连接报文。序号seq=a,FIN标志位置为1,TCP标准规定:FIN报文段即使不携带数据,也会消耗一个序号。此时客户进入FIN-WAIT-1(终止等待1)状态。

  服务器进程收到释放连接报文后,会发出确认报文。序号seq=b,确认序号ack=a+1,ACK标志置为1。此时服务器进程进入CLOSE-WAIT(关闭等待)状态。整个TCP连接处于半关闭状态,即客户进程不能向服务器进程发送数据,但是能够接收来自服务器进程的数据。这个状态可能会持续一段时间,直到服务器进程数据发送完毕,主动释放连接。

  客户进程收到服务器的确认报文后,进入FIN-WAIT-2(终止等待2)状态,等待服务器进程发送释放连接报文。

  服务器进程在数据传输完毕后,发出释放连接报文。序号seq=c,确认序号ack=a+1,FIN和ACK标志位都置为1。此时服务器进程进入LAST-ACK(最后确认)状态。

  客户进程收到释放连接报文后,发出确认报文。序号seq=a+1,确认序号c+1,ACK标志位置为1。此时客户进程进入TIME-WAIT(时间等待)状态。经过时间等待计时器设置的时间2MSL后,客户进程进入CLOSED状态。

  服务器进程收到确认报文关闭连接,因为主动发起关闭进程需要经过2MSL之后才会关闭,因此一般被动关闭进程的关闭时间要早一些。

2、MSL

  MSL叫做最长报文段寿命,RFC 793建议设置为2分钟,但是TCP允许根据不同的情况来设置具体的时间。

  为什么TIME-WAIT的进程需要在2MSL后进入CLOSED状态呢?主要有以下两个方面:

  第一,为了保证被动关闭进程能够顺利关闭连接。如果经过等待时间直接进入关闭状态,不能够保证被动关闭方是否收到确认关闭报文,一旦报文丢失,则被动关闭方无法正常关闭。关闭方有2MSL等待时间,在此期间,如果被动关闭进程没有收到确认关闭报文,则会重传释放连接报文。收到重传的释放连接报文后,主动关闭方会重发确认报文,并重新启动时间等待计时器,倒计时2MSL后进入CLOSED状态。

  第二,等待该连接中所有的报文从网络中消失。经过2MSL时间后,可以使连接发送的报文从网络中消失,防止在下一个连接中出现旧的请求报文。

3、保活定时器

  保活定时器是一个有争议的功能,保活并不在TCP的规范中,很多人认为保活功能不应该在TCP中实现,应该由应用程序来完成。

  保活计时器主要有三个缺点:

1、在出现短暂差错时,一个很好的连接被释放掉。

2、消耗多余的带宽。

3、在按分组计费的情况下会在互联网上花掉更多的钱。

  保活功能主要是为服务器应用程序提供的,保活定时器在两端出现临时故障时,能够很恰当的把连接关闭。基于这种优点,TCP应用一般都实现了保活计时器。

  在客户与服务器建立连接后,如果客户主机突然出现故障,这时保活计时器就发挥出作用了。服务器每次收到用户数据,都会重新设置保活定时器,时间通常是两小时。若两个小时没有收到客户的数据,服务器会发送一个探测报文段,随后每隔75秒发送一次。发送10次之后仍无响应,服务器认定客户端发生故障,主动关闭这个连接。

四、总结

  传输层协议主要有两种:TCP、UDP。TCP提供点到点的可靠交付服务,UDP不提供可靠交付。

  TCP数据报文段分两部分:首部、数据。首部的字段能体现出TCP的全部功能,首部最小20字节,最大60字节。

  TCP在传输数据前需要先建立连接,连接的建立需要经过三次握手。数据传输完毕后要关闭连接,连接双方均可主动关闭连接,关闭连接需要经过四次握手。

  在连接的一方出现故障时,通过设置保活计时器能够主动关闭连接,不至于使没出现故障的一端陷入无意义的等待中。

如需转载,烦请注明出处:https://www.cnblogs.com/lidengfeng/p/10455557.html

网络学习笔记(一):TCP连接的建立与关闭的更多相关文章

  1. TCP/IP详解学习笔记(10)-TCP连接的建立与中止

    TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接.这和前面讲到的协议完全不同.前面讲的所有协议都只是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编 ...

  2. 利用tcpdump分析工具来验证tcp连接的建立和关闭过程

    本文要求读者在阅读之前应该对TCP通过三次握手建立和关闭连接有一定的了解,本文并没有详细讲解三次握手,只是通过一个实例对三次握手进行了一下验证. tcp连接的建立和关闭想必大家都已经非常熟悉了!通过三 ...

  3. 从Wireshark看TCP连接的建立与关闭

    TCP是一种面向连接.可靠的协议.TCP连接的建立与断开,都是需要经过通信双方的协商.用一句话概括就是:三次握手say hello(建立连接):四次握手say goodbye(断开连接).要了解TCP ...

  4. TCP连接的建立与关闭

    TCP是主机对主机层的传输控制协议:建立连接要三个握手,断开连接要四次挥手. 位码即TCP标志位,有6种标示:SYN(synchronous建立联机),ACK(acknowledgement 确认), ...

  5. 网络学习笔记:TCP/IP连网和Internet

    1.网关 由硬件和软件组成,实现不同网段间的数据传送. 常用路由器充当网关. 网关通常维护一份路由表,但只有少量的编址信息.它用这些信息把数据转发到知道更多信息的网关. 组成互联网骨干的网关称为核心网 ...

  6. TCP/IP详解学习笔记(14)-TCP连接的未来和性能(未写完)

    在TCP刚出世的时候,其主要工作环境是以太网和SLIP之类的低速网络.随着高速网络的出现,让TCP协议的吞吐量更大,效率更高的要求就愈来愈迫切.为此,TCP增加了三个重要机制来对应现在的变化,他们是 ...

  7. TCP连接的状态与关闭方式及其对Server与Client的影响

    TCP连接的状态与关闭方式及其对Server与Client的影响 1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用. ...

  8. TCP连接的状态与关闭方式,及其对Server与Client的影响

    1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用.特定数据包以及超时等,具体状态如下所示: CLOSED:初始状态, ...

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

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

随机推荐

  1. Java设计模式之《适配器模式》及应用场景

    转自https://www.cnblogs.com/V1haoge/p/6479118.html 适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常 ...

  2. go语言nsq源码解读五 nsqlookupd源码registration_db.go

    本篇将讲解registration_db.go文件. 1234567891011121314151617181920212223242526272829303132333435363738394041 ...

  3. fastjson使用中遇到的

    二. fastjson 解析json字符串为四种类型 1. JavaBean Person person = JSON.parseObject(jsonString, Person.class); 2 ...

  4. 随手一记,maven打包

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-depen ...

  5. 将外部dwg图纸中指定带属性的块插入到当前图纸中

    static void InsertBlock() { //获取要插入的块名 TCHAR str[40]; acedGetString(Adesk::kFalse, _T("\n请输入要插入 ...

  6. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  7. vue防止按钮在短时间内被多次点击的方法

    vue组件 (function(){ let openDelay=false; Vue.directive('intervalclick', function(el,binding){ el.oncl ...

  8. PostgreSQL:安装及中文显示

    一.PostgreSQL PostgreSQL (也称为Post-gress-Q-L)是一个跨平台的功能强大的开源对象关系数据库管理系统,由 PostgreSQL 全球开发集团(全球志愿者团队)开发. ...

  9. Asp.Net Core 轻松学-正确使用分布式缓存

    前言     本来昨天应该更新的,但是由于各种原因,抱歉,让追这个系列的朋友久等了.上一篇文章 在.Net Core 使用缓存和配置依赖策略 讲的是如何使用本地缓存,那么本篇文章就来了解一下如何使用分 ...

  10. java之servlet入门操作教程一续

    本节主要是在java之servlet入门操作教程一  的基础上使用myeclipse实现自动部署的功能 准备: java之servlet入门操作教程一 中完成myFirstServlet项目的创建: ...