博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP协议
阅读量:4579 次
发布时间:2019-06-09

本文共 2161 字,大约阅读时间需要 7 分钟。

简介

  TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、 基于IP的传输层协议。

OSI的七层模型

  

  数据从应用层发下来,会在每一层都会加上头部信息,进行 封装,然后再发送到数据接收端。接收端收到数据会一层一层的解码,

每一层的作用和对应的协议如下:

  

 

 

三次握手四次挥手简图

三次握手(建立连接)

  第一次:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

  第二次:服务器收到SYN包,向客户端返回ACK(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RCVD状态;

  第三次:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

  完成三次握手,客户端与服务器开始传送数据,也就是ESTABLISHED状态。

三次握手保证了不会建立无效的连接,从而浪费资源。 

四次挥手(断开连接)

  第一次: TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。

  第二次:服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

  第三次:服务器关闭客户端的连接,发送一个FIN给客户端。

  第四次:客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

四次挥手过程中的状态变化:

  FIN_WAIT_1:当主动关闭连接的一方发送FIN,但没有接收到对象返回的ACK,会进入这个状态 

  FIN_WAIT_2:当主动关闭连接的一方发送FIN,接收到对象返回的ACK,会进入这个状态 

  CLOSE_WAIT:等待关闭,当接收到对方发送给自己的FIN以后,检查自己是否还有数据发送给对方,需要完成的事情是等待你去关闭连接。(被动方)

  LAST_ACK::它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报 文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。(被动方)

  TIME_WAIT::表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。

  CLOSED:表示连接中断。

为什么要三次握手而四次回收

  之所以绝大数时候我们看到的都是四次挥手,是因为收到fin后,知道对方要关闭了,然后OS通知应用层要关闭啥的,这里应用层可能需要做些准备工作,有一些延时,所以先回ack,准备好了再发fin 。 握手过程没有这个准备过程所以可以立即发送syn+ack。

重传机制:

  TCP协议要求在发送端每发送一个报文段,就启动一个定时器并等待确认信息;接收端成功接收新数据后返回确认信息。若在定时器超时前数据未能被确认,TCP就认为报文段中的数据已丢失或损坏,需要对报文段中的数据重新组织和重传。重传一定量次数以后如果依然失败,会结束连接。

2MSL等待状态(两个作用)

  MSL:报文的最大存活时间

  第一个作用:当TCP执行一个主动关闭,并发回最后一个ACK,该链接必须在TIME_WAIT状态停留的时间为2MSL。这样可让TCP有机会在此发送最后一个ACK以防这个ACK丢失

  第二个作用:这是说在2MSL时间内,虽然可以重新启动服务器,但是这个服务器还是要平静等待MSL时间才能进行下一次连接,这样可以避免端口冲突

半开状态:

  一方已经关闭或异常终止连接而另一方却不知道,如果这个时候连接发送数据,将会返回RST,这种状态可以通过保活措施来检测出来(keepalive)

半关状态:

  TCP连接一端在结束它的发送后还能接收来自另一端数据的能力,即数据只能单向流动,程序调用的是shutdown,而不是close。

保活(keepalive):

  作用:探测连接的对端是否存活,避免因为只有一段连接存在而一段关闭的状态存在浪费资源,还可以避免中间设备因为连接长时间不用而删除连接,导致出错。

  步骤:在连接的指定时间内无数据交换,则会进行保活探测,服务端发送保活报文,若对方正确返回报文则会重置保活定时器的时间,若没有接收到正确的回应,则会根据指定的间隔继续发送探测报文,知道发送到达指定次数后,就会断开连接。

 

长连接短连接:

  短连接在数据包发送完成后就会自己断开。

  长连接在发包完毕后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接,长连接会通过keepalive来探测另一端的状态

  长连接需要在http的头部设定 : Connection: Keep-alive  , 短连接为 : Connection: close

  TCP的keepalive和HTTP的Keepalive不同,一个是检测机制,一个为标识是否为长连接。

 

 

 

 

 

参考文章:http://network.51cto.com/art/201411/456783.htm

 

转载于:https://www.cnblogs.com/liyuhui-Z/p/7736013.html

你可能感兴趣的文章
CDQ分治入门 + 例题 Arnooks's Defensive Line [Uva live 5871]
查看>>
如何在MyBatis中优雅的使用枚举
查看>>
SCVMM 2012 SP1 安装
查看>>
可做爬虫的jsoup常用方法,附异步请求实现
查看>>
redis分布式工具类 ----RedisShardedPoolUtil
查看>>
H5新属性FileReader实现选择图片后立即显示在页面上
查看>>
LEDAPS1.3.0版本移植到windows平台----HuPm参数初始化模块
查看>>
【微服务架构】SpringCloud之Hystrix断路器(六)
查看>>
项目复审与事后分析
查看>>
PCA(主分量分析)-转载
查看>>
Hadoop 2.0命令手册
查看>>
SVN 提交项目.a文件缺失 cornerstone设置方法
查看>>
git push不用重复输入用户名和密码(解决方案)
查看>>
委托与事件
查看>>
实现POST服务器
查看>>
Linux下的tar压缩解压缩命令详解
查看>>
大数据项目测试<二>项目的测试工作
查看>>
linux网路IP.设定主机名.ssh .bash命令&通配符
查看>>
mysql 行列动态转换(列联表,交叉表)
查看>>
软件开发模式
查看>>