浅析TCP协议

  • TCP是什么?

    • 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。可以通过百度百科了解。

    • 如何理解面向链接?

      面向链接并不是物理意义上使用网线将两端进行链接,而是通过三次握手,建立虚拟链接。(即两端开辟资源,创建socket)。

    • 如何理解可靠性?

      可靠性个人认为主要是通过:1、确认机制 2、重传输机制 3、差错检测。

      这里直接引用百度百科中的内容:TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

  • TCP的三次握手

    • ​ 三次握手过程图:
      在这里插入图片描述

    • 三次握手过程

      • 客户端发送SYN(SYN=1,ACK=0,seq=x)报文给服务器端,进入SYN_SEND状态。

        • SYN=1,ACK=0表示该报文段为连接请求报文。
        • x为本次TCP通信的字节流的初始序号。
        • TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号。
      • 服务器端收到SYN报文,回应一个SYN (SYN=1,ACK=1,seq=y,ack=x+1)报文,进入SYN_RECV状态。

        • SYN=1,ACK=1表示该报文段为连接同意的应答报文。
        • seq=y表示服务端作为发送者时,发送字节流的初始序号。
        • ack=x+1表示服务端希望下一个数据报发送序号从x+1开始的字节。
      • 客户端收到服务器端的SYN报文,回应一个ACK(ACK=1,seq=x+1,ack=y+1)报文,客户端发送后进入Established状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!

        有两个注意点:1、TCP有延迟确认的功能 ,主要作用也是提高传输效率。可参考博客:https://blog.csdn.net/shawei_/article/details/81809027

          					 2、TCP报文段中含有两个ack。
        

        ​ 3、报文中seq(序号)的作用:一方面是保证报文传输的可靠,同时也保证了传送到接收端实体的包的按序接收(个人认为,报文在传输中链路网络情况不可预期,所以应该是使得服务端可以对于接收到的报文进行重排序)。

    • 抓个包看看:

      • 使用命令:tcpdump -nn -i eth0 port 80

        在这里插入图片描述

      • 也可以使用命令查看详情: tcpdump -nn -X -i eth0 port 80

    • 为什么是三次握手?

      • 三次握手的目的:为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。三次通信是理论上的最小值。
      • 举个例子:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。
      • 若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。
        链接:https://www.zhihu.com/question/24853633/answer/254224088
      • 可以参考知乎:https://www.zhihu.com/question/24853633
  • 四次分手

    • 四次分手过程图:
      在这里插入图片描述

    • 四次分手过程:

      • 第一次挥手:若A认为数据发送完成,则它需要向B发送连接释放请求。该请求只有报文头,头中携带的主要参数为:FIN=1,seq=u。此时,A将进入FIN-WAIT-1状态。
        • FIN=1表示该报文段是一个连接释放请求。
        • seq=u,u-1是A向B发送的最后一个字节的序号。
      • 第二次挥手:B收到连接释放请求后,会通知相应的应用程序,告诉它A向B这个方向的连接已经释放。此时B进入CLOSE-WAIT状态,并向A发送连接释放的应答,其报文头包含:ACK=1,seq=v,ack=u+1。
        • ACK=1:除TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答。
        • seq=v,v-1是B向A发送的最后一个字节的序号。
        • ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节。
        • A收到该应答,进入FIN-WAIT-2状态,等待B发送连接释放请求。
        • 第二次挥手完成后,A到B方向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据。
      • 第三次挥手:当B向A发完所有数据后,向A发送连接释放请求,请求头:FIN=1,ACK=1,seq=w,ack=u+1。B便进入LAST-ACK状态。
      • 第四次挥手:A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。
      • 为什么A要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态?
        • 为了保证B能收到A的确认应答。
          若A发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。
    • 为什么是四次分手?

      • 因为TCP连接是全双工模式,即客户端和服务端都可以发送、接收数据。每次发送FIN报文都表示该方向不会再进行数据传输,每个FIN都需要进行确认,保证消息的可靠性,所以需要四次分手。(客户端 -> 服务端方向FIN + ACK; 服务端 ->客户端方向FIN + ACK)
  • 滑动窗口机制

    • 窗口:

      • 发送窗口:发送方一次能发送多少字节的大小。

      • 接收窗口:接收方缓冲区用于接受数据空间大小。

      • 发送窗口与接收窗口的关系:TCP是双工的协议,会话的双方都可以同时接收、发送数据。TCP会话的双方都各自维护一个“发送窗口”和一个“接收窗口”。其中各自的“接收窗口”大小取决于应用、系统、硬件的限制(TCP传输速率不能大于应用的数据处理速率)。各自的“发送窗口”则要求取决于对端通告的“接收窗口”,要求相同。

      在这里插入图片描述

    • TCP拥塞控制算法(也称AIMD算法):

      • 慢启动:每当建立一个TCP连接时或一个TCP连接发生超时重传后,该连接便进入慢启动阶段。进入慢启动后,TCP实体将拥塞窗口的大小初始化为一个报文段,即:cwnd=1。此后,每收到一个报文段的确认(ACK),cwnd值加1,即拥塞窗口按指数增加。当cwnd值超过慢启动阐值(ssthresh)或发生报文段丢失重传时,慢启动阶段结束。前者进入拥塞避免阶段,后者重新进入慢启动阶段。

      • 拥塞避免:在慢启阶段,当cwnd值超过慢启动阐值(ssthresh)后,慢启动过程结束,TCP连接进入拥塞避免阶段。在拥塞避免阶段,每一次发送的cwnd个报文段被完全确认后,才将cwnd值加1。在此阶段,cwnd值线性增加。

        在这里插入图片描述

        • 快速重传:快速重传是对超时重传的改进。当源端收到对同一个报文的三个重复确认时,就确定一个报文段已经丢失,因此立刻重传丢失的报文段,而不必等到重传定时器(RTO)超时。以此减少不必要的等待时间。
        • 快速恢复:快速恢复是对丢失恢复机制的改进。在快速重传之后,不经过慢启动过程而直接进入拥塞避免阶段。每当快速重传后,置ssthresh=cwnd/2、ewnd=ssthresh+3。此后,每收到一个重复确认,将cwnd值加1,直至收到对丢失报文段和其后若干报文段的累积确认后,置cwnd=ssthresh,进入拥塞避免阶段。
    • 流量控制:TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

    • 流量控制:TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值