传输层TCP协议连接的建立和断开
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了传输层TCP协议连接的建立和断开相关的知识,希望对你有一定的参考价值。
参考技术A 什么是TCP呢?
由三个单词组成的Transport Control Protocol,字面理解是传输控制协议,可以理解为比特同学要想在网络泳池里游泳,那么他必须学习传输层控制技能,并且要掌握相应的动作——协议,他才能在畅游世界网络这个超大型游泳池。
TCP:一个传输层协议,提供Host-To-Host的可靠传输,支持全双工,是一个面向连接的协议。
TCP工作在传输层,它的上层是应用层,应用就是人们常用的微信、抖音、王者荣耀等服务工作的协议。两台不同的设备使用微信聊天,发送语音,需要实现Host-To-Host的数据通信,那么就可以直接调用TCP协议进行。
调用TCP通信时需要指定通信的端口,不同的端口对应不同应用,不同IP对应不同的主机,也就是不同的设备。这就涉及到网络地址—— IP地址 ,工作在网络层,当然TCP层只负责把对应的IP地址和端口传给网络层即可,具体业务由网络层来实现。
互联网层,即Network Layer ,提供地址和地址间的通信,只关注地址到地址Address-To-Address间通信,具体设备间通信由数据链路层实现,数据链路层关注MAC地址间通信,具体的物理设备,传输介质由物理层负责。
以上就是TCP/IP协议常用的层级分割,最终目的就是为Host-To-Host服务,实现应用到应用的通信服务。
什么是连接和会话呢?
连接事需要通信双方相互配合来实现的,是双方达成的一种即时的状态约定,保证通信双方都在线,都有能力为接下来的数据传输做出尽快的响应,我们称之为 连接 。
连接是网络行为状态的记录,既然连接需要双方共同努力,那么就需要双方都有一个对象来记忆当前传输的数据类型,对方的端口、已经传输了多少,效率怎么样等等一些关注点。
那么与之相关联的另一个名词 会话(Session) ,是什么意思呢,会话是应用的行为。大家每次用微信聊天时都会有一个窗口,用来发送信息,你来我往,这个窗口中会有很多条信息,我们称之为会话,当我们在会话进行中,连接一定是在通信状态的。聊一会,累了,退出微信了,但是一般我们不会删除我们的会话内容,这时会话还在,但是连接已经中断。
双工/单工问题
想想自己理解的是什么?
单工:任何时间,数据只能单向发送,单工至少需要一条线路
半全双工:某一时候可以双向发送数据,至少需要一条线路
全双工:任何时刻都可以双向发送数据,大于一条线路
这里线路不一定真实存在物理线路,可能采用模拟的形式实现
TCP是一个全双工协议,数据任何时刻都可以双向发送 ,这说明服务器和客户端可以根据需要选择任意时刻发送和接收信息,所以呢都可以被称为主机(Host)
可靠性的定义
TCP可以提供可靠性,那么可靠性具体的实现方式是什么呢?
可靠性指数据无损传输 。发送主机按照顺序发送数据,数据通过网络传输,收不同网络条件限制,数据不会按照发送时的顺序到达接收方,这时我们就需要一种算法来保证接收方可以还原出发送方的顺序。这里还有一个概念叫 多播 ,发送方同时发送给多个接收方信息,如果接收方中有一个接收到了这条信息,我们的可靠性就必须保证其他接收方也必须接收到相同的信息,这里我们不讨论多播。
TCP的握手和挥手
TCP是一个面向连接的连接的协议, 握手 是建立连接的过程, 挥手 是断开连接的过程。
TCP的基本操作
以上三种操作以后,另一方必须立即给发起方返回一个 ACK(Ackknowledgement) ,这是TCP保证可靠性的要求。如果一方不回复发送方ACK,发送方则认为接收方没有收到信息,会重新发送。
建立连接的过程-三次握手
三次握手的形成和TCP要求每次发送方发送信息以后,接收方必须返回ACK确认有直接的关系
上图描述了TCP建立连接的过程,分为6步:
TCP建立连接的过程如上,那么为什么是三次呢?
第二步服务端做准备,因为是首次收到发送数据请求,无需处理,可以立刻进入数据交互状态,所以可以立刻发送给客户端SYN,告诉客户端,我已准备好,所以第三步和第四步可以合并为一次握手——ACK-SYN,然后客户端回应ACK,连接建立完成
以上就是三次握手了
具体在数据交互过程,ACK和SYN等需要用标识位来标记,在实际应用中,我们一般使用1来表示开启,0表示关闭。
那么四次挥手为什么是四次呢,主要是因为,挥手时服务端收到FIN以后,不能马上回复FIN,因为自身还有任务没有处理完,所以上面所说的6步中,第3、4步就不能一起回复,只能先回复ACK,等自身任务处理完毕,才能告诉客户端,我已经准备好,可以关闭连接,这样就需要4次数据交互,如下图:
TCP三次握手建立链接与四次挥手断开链接
防伪码:从基础开始,一步一个脚印
先简单介绍一下TCP协议。
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。很复杂,但属于不论程序员还是运维人员都必会的基本功。
面向对象的——连接双方在通信前需要预先建立一条连接,这犹如实际生活中的打电话,电话必须拨通了以后才能交流。
可靠的——TCP协议中有诸多的规则来保障通信链路的可靠性,含应用数据分隔、重传机制、对首部和数据校验、对收到的数据进行排序,然后交给应用层、接收端会丢弃重复的数据、可进行流量控制。
TCP数据被封装在一个IP数据报中,格式如下:
含:端口号[16bit]、序号[32bit]、偏移[4bit]、Reserved [6bit]、标志[6bit]、窗口大小(window)[16bit]、校验和[16bit]、紧急指针[16bit]、TCP选项
这里需要注意的:
TCP的包是没有IP地址的,那是IP层上的事,但是有源端口和目标端口。
一个TCP连接需要四个元组来表示是同一个连接(src_ip, src_port, dst_ip, dst_port)准确说是五元组,还有一个是协议。但因为这里只是说TCP协议,所以,这里我只说四元组。
Sequence Number是包的序号,用来解决网络包乱序(reordering)问题。
Acknowledgement Number就是ACK——用于确认收到,用来解决不丢包的问题。
Window又叫Advertised-Window,也就是著名的滑动窗口(Sliding Window),用于解决流控的。
TCP Flag ,也就是包的类型,主要是用于操控TCP的状态机的。
URG: 紧急指针有效
ACK:确认序号有效
PSH:接收方应尽快将这个报文段交给应用层
RST:重建连接
SYN:同步序号,用来发起一个连接
FIN: 发端完成发送任务(主动关闭)
三次握手建立链接
1.请求端(client客户端)发送一个SYN=1指明客户打算连接的服务器的端口,TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的初始序号seq为一个随机数假定为seq=x。
2.服务端(server)对客户端报文段进行确认,将确认序号设置为ACK=x+1。同时也请求连接客户端,发送SYN=1,并且发送初始seq号假定为seq=y。
3.客户端对服务端报文段进行确认,发送确认序号并同意与服务端建立连接ACK=y+1。
这三个报文段完成连接的建立。这个过程也称为三次握手(three-way handshake)
四次挥手断开链接
1.主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
2.主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我也没有数据要发送了,可以进行关闭连接了;
3.主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入CLOSE_WAIT状态;
4.第主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
至此,TCP的四次分手就这么愉快的完成了。建立链接和断开链接图示如下:
下面来分解一下为什么是三次握手呢?
为了防止已失效的链接请求报文段突然又传送到了服务器端,因而产生错误。举一个“栗”子。
client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。"
这就很明白了,防止了服务器端的一直等待而浪费资源。
那么又为什么是四次挥手呢?
TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2, 它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN 报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此 就会愉快的中断这次TCP连接。如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。本文出自 “墨” 博客,请务必保留此出处http://jinyudong.blog.51cto.com/10990408/1899921
以上是关于传输层TCP协议连接的建立和断开的主要内容,如果未能解决你的问题,请参考以下文章