网络学习笔记(一):TCP连接的建立与关闭
五层网络模型分为:物理层、数据链路层、网络层、传输层、应用层。其中,传输层有两种主要协议:面向连接的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连接的建立与关闭的更多相关文章
- TCP/IP详解学习笔记(10)-TCP连接的建立与中止
TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接.这和前面讲到的协议完全不同.前面讲的所有协议都只是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编 ...
- 利用tcpdump分析工具来验证tcp连接的建立和关闭过程
本文要求读者在阅读之前应该对TCP通过三次握手建立和关闭连接有一定的了解,本文并没有详细讲解三次握手,只是通过一个实例对三次握手进行了一下验证. tcp连接的建立和关闭想必大家都已经非常熟悉了!通过三 ...
- 从Wireshark看TCP连接的建立与关闭
TCP是一种面向连接.可靠的协议.TCP连接的建立与断开,都是需要经过通信双方的协商.用一句话概括就是:三次握手say hello(建立连接):四次握手say goodbye(断开连接).要了解TCP ...
- TCP连接的建立与关闭
TCP是主机对主机层的传输控制协议:建立连接要三个握手,断开连接要四次挥手. 位码即TCP标志位,有6种标示:SYN(synchronous建立联机),ACK(acknowledgement 确认), ...
- 网络学习笔记:TCP/IP连网和Internet
1.网关 由硬件和软件组成,实现不同网段间的数据传送. 常用路由器充当网关. 网关通常维护一份路由表,但只有少量的编址信息.它用这些信息把数据转发到知道更多信息的网关. 组成互联网骨干的网关称为核心网 ...
- TCP/IP详解学习笔记(14)-TCP连接的未来和性能(未写完)
在TCP刚出世的时候,其主要工作环境是以太网和SLIP之类的低速网络.随着高速网络的出现,让TCP协议的吞吐量更大,效率更高的要求就愈来愈迫切.为此,TCP增加了三个重要机制来对应现在的变化,他们是 ...
- TCP连接的状态与关闭方式及其对Server与Client的影响
TCP连接的状态与关闭方式及其对Server与Client的影响 1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用. ...
- TCP连接的状态与关闭方式,及其对Server与Client的影响
1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用.特定数据包以及超时等,具体状态如下所示: CLOSED:初始状态, ...
- TCP/IP详解学习笔记(13)-- TCP连接的建立与终止
1.TCP连接的建立 设主机B运行一个服务器进程,它先发出一个被动打开命令,告诉它的TCP要准备接收客户进程的连续请求,然后服务进程就处于听的状态.不断检测是否有客户进程发起连续 ...
随机推荐
- 硬木地板 JDFZ1667
Description 举行计算机科学家盛宴的大厅的地板为M×N (1<=M<=9, 1<=N<=9)的矩形.现在必须要铺上硬木地板砖.可以使用的地板砖形状有两种:1) 2×1 ...
- MySql-两阶段加锁协议
此篇博客主要是讲述MySql(仅限innodb)的两阶段加锁(2PL)协议,而非两阶段提交(2PC)协议,区别如下: 2PL,两阶段加锁协议:主要用于单机事务中的一致性与隔离性. 2PC,两阶段提交协 ...
- 如何删除git远程仓库项目的所有内容,重新提交所有内容
如果我们上传了一个项目到git并已经commit和push了所有内容,但是忘记搞gitignore文件, 导致一些不想加入版本控制的文件,如IDE配置文件,编译文件,部署文件等, 现在不知道怎么办了? ...
- 从一到万的运维之路,说一说VM/Docker/Kubernetes/ServiceMesh
摘要:本文从单机真机运营的历史讲起,逐步介绍虚拟化.容器化.Docker.Kubernetes.ServiceMesh的发展历程.并重点介绍了容器化阶段之后,各项重点技术的安装.使用.运维知识.可以说 ...
- 一文了解 Hadoop 运行机制
大数据技术栈在当下已经是比较成熟的了,Hadoop 作为大数据存储的基石,其重要程度不言而喻,作为一个想从 java 后端转向大数据开发的程序员来说,打好 Hadoop 基础,就相当于夯实建造房屋的地 ...
- 我是如何将博客转成PDF的
前言 只有光头才能变强 之前有读者问过我:"3y你的博客有没有电子版的呀?我想要份电子版的".我说:"没有啊,我没有弄过电子版的,我这边有个文章导航页面,你可以去文章导航 ...
- C# 将object对象转换为实体对象
C# 将object对象转换为实体对象.一共两种方法. 第一种方法,代码如下: /// <summary> /// 将object对象转换为实体对象 /// </summary> ...
- 由浅入深讲解责任链模式,理解Tomcat的Filter过滤器
本文将从简单的场景引入, 逐步优化, 最后给出具体的责任链设计模式实现. 场景引入 首先我们考虑这样一个场景: 论坛上用户要发帖子, 但是用户的想法是丰富多变的, 他们可能正常地发帖, 可能会在网页中 ...
- vue 中使用sass实现主体换肤
有如下代码要实现换肤功能 <template> <div class="app-root" :class="themeClass"> & ...
- wow.js让css3动画变动更有趣(滚动页面动画模拟懒加载特效)
CSS3的出现给网站页面增加了活力,网站增色不少,有这么小小的一款插件就能做出很多动画效果. 最重要的是它:简单易用.轻量级.无需 jQuery......他就是wow.js 地址:https://d ...