2.TCP的三次握手和四次挥手

一、TCP概述

TCP(Transmission Control Protocol, 传输控制协议)

1.简介

​ TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。

       应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(最大传输段大小(MSS, Maximum Segment Size)通常受该计算机连接的网络的数据链路层的最大传输单元(MTU, Maximum Transmission Unit)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号seq,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK, Acknowledgement);如果发送端实体在合理的往返时延(RTT, Round-Trip Time)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

2.分点概括

  • 面向连接的、可靠的、基于字节流的传输通信协议
  • 将应用层的数据流分割为合适大小的报文段送至网络层
  • 对数据包标号,接收方收到则返回ACK确认,在RTT时间内未收到则重传
  • 使用校验和函数来检验数据是否有错误

二、TCP报文解析

1.报文格式

在这里插入图片描述

2.字段说明

  • 端口号

    作用:用来标识同一台计算机的不同的应用进程。

    (1)源端口:源端口和IP地址的作用是标识报文的返回地址。

    (2)目的端口:端口指明接收方计算机上的应用程序接口。

    TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。

  • 序号和确认序号

    (1)序号:Seq序号,占32位,TCP可靠传输的关键部分,是本报文段发送的数据组的第一个字节的序号,它确保了TCP传输的有序性。

    (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。

  • 数据偏移

    占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。

  • 保留

    占 6 位,保留为今后使用,但目前应置为 0。

  • 控制位

    (1)URG:紧急指针标志,为1时表示紧急指针有效,它告诉系统此报文段中有紧急数据,应尽快传送,为0则忽略紧急指针。
    (2)ACK:确认序号标志,为1时表示确认号有效,为0表示确认号无效。
    (3)PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
    (4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
    (5)SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
    (6)FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。

  • 窗口

    滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小是一个16bit字段,因而窗口大小最大为65535( 2 16 2^{16} 216-1)。

  • 校验和

    奇偶校验(Parity Check),此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。

  • 紧急指针

    只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。

  • 选项和填充

    最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。

  • 数据部分

    TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 报文头。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

三、TCP三次握手

1.三次握手的目的

  • 目的

    为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误。

  • 辩证

           如果使用两次握手:Client向Server发送SYN请求,但是由于网络原因,SYN请求滞留于网络中的某个节点从而未及时到达Server。同时,Client在RTT时间内未收到Server的[SYN, ACK]确认报文便重新发起第二次SYN请求,Server成功收到第二次请求并回复Client [SYN, ACK]报文,这时Client发送的第一个SYN请求终于到了Server,对于Server来说这时一个创建新连接的请求,需要为这个连接分配资源,返回 [SYN, ACK]报文,然而这是个无效的报文(Client默认使用第二次联通的连接,弃用第一次的SYN请求),Client收到并不会对其作出任何回应,而Server却不知道,Server会一直为这个连接维持资源(只要Server发出[SYN, ACK]报文,不管Client有没有收到,它就认为连接已建立,因为它没有第三步确认机制),造成资源的不必要的浪费。

           如果是三次握手:Server若在规定的RTT时间内未收到Client的ACK请求,便会放弃这段连接,释放资源。

  • 本质

    信道是不可靠的,但是我们要建立可靠的连接发送可靠的数据,也就是数据传输是需要可靠的。在这个时候三次握手是一个理论上的最小值,并不是说是tcp协议要求的,而是为了满足在不可靠的信道上传输可靠的数据所要求的。

2.三次握手模型

在这里插入图片描述

3.三次握手详解

  • 第一次

    客户端主动打开,发送连接请求报文段,将SYN标识位置为1,Sequence Number置为x(TCP规定SYN=1时不能携带数据,x为随机产生的一个值),然后进入SYN_SENT状态。

  • 第二次

    服务器收到SYN报文段进行确认,将SYN标识位置为1,ACK置为1,Sequence Number置为y,Acknowledgment Number置为x+1,然后进入SYN_RECV状态,这个状态被称为半连接状态。

  • 第三次

    客户端再进行一次确认,将ACK置为1(此时不用SYN),Sequence Number置为x+1,Acknowledgment Number置为y+1发向服务器,最后客户端与服务器都进入ESTABLISHED状态。

4.术语释义

  • CLOSED

    表示初始状态。

  • SYN_SENT

    个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。

  • LISTEN

    表示服务器端的某个SOCKET处于监听状态,可以接受连接了。

  • SYN_RCVD

    这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂。

四、TCP四次挥手

1.四次挥手的目的

​       由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

2.四次挥手模型

在这里插入图片描述

3.四次挥手详解

  • 第一次

    Client向Server发送一个FIN报文,用来关闭Client到Server的数据传输,Client进入到FIN_WAIT_1状态。

  • 第二次

    Server收到FIN报文后,发送一个ACK给Client,确认序号为收到序号为收到序号加1(于SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态,Client进入FIN_WAIT_2状态。此时Server如有向Client未发送完成的数据,可继续传输。

  • 第三次

    Server向Client发送一个FIN报文,用来关闭Server到Client的数据传输,Server进入到LAST_ACK状态。

  • 第四次

    Client接收到Server发送的FIN报文后,Client进入到TIME_WAIT

    状态,紧接着发送一个ACK给Server,确认号为收到序号加1,Server进入ClOSED状态,四次挥手结束。

4.术语释义

  • FIN_WAIT_1和FIN_WAIT_2

    FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的。实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。

  • CLOSE_WAIT

    表示在等待关闭。当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是查看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。

  • TIME_WAIT

    确保有足够的时间让对方收到ACK报文,如被动关闭方未收到ACK报文,就会触发被动端重发FIN报文,一来一去就是2MSL(Maximum Segment Lifetime,报文段最大生存时间)。

  • LAST_ACK

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值