浅聊TCP协议

1、概念介绍

名称:TCP,Transmission Control Protocol,传输控制协议

定义:是一种面向连接的、可靠的、基于字节流的传输层通信协议

  • 面向连接:一对一的连接,只能提供两个端点的服务

  • 可靠:⽆论的⽹络链路中出现了怎样的链路变化,TCP 都可以保证⼀个报⽂⼀定能够到达接收端,按序、无差错、不重复、不丢包

  • 字节流:传输的数据没有固有的“报文”或”报文边界”的概念;⽆论我们消息有多⼤都可以进⾏传输

2、报文结构

参数名称

长度/bit

含义说明

作用

源端口

16

发送方的端口号

目的端口

16

接收方的端口号

序号req

32

从发送端向接收端发送的字节流编号

解决网络传输中可能会出现的乱序问题

确认号ack

32

接收方回发的应答顺序编号

解决网络传输中可能会出现的丢包的问题

偏移

4

数据起始处距离报文段起始处有多远。实际上是指出TCP报文段的首部长度

保留位

6

保留以后使用

URG

1

紧急标志位:1表示“紧急指针”有效,0无效

PSH

1

推送标志位:1表示需要将数据立刻发送给应用程序,不用再等到整个缓存都填满了后再向上交付

RST

1

复位标志位:1表示需要重连(置为1还用来拒绝一个非法的报文段或拒绝打开一个连接)

ACK

1

确认标志位:请求/应答状态;0为请求,1为应答

确认应答机制

SYN

1

同步标志位:握手时使用,1表示连接请求报文

为1表示其想建立连接,设置序列号初始值以便开始建立连接

FIN

1

终止标志位:1表示需要断开连接

为1代表连接异常,必须强制断开连接

窗口

16

表示从本报文段首部中的确认号算起,接收方目前允许对方一次发送的数据量(动态变化)

校验和

16

包括首部和数据这两部分,需要加上12字节的伪首部

由发送方计算和存储,由接收方校验

紧急指针

16

指出本数据段中为紧急数据的字节数,紧急数据无须缓存,当前窗口大小为0也是可以发送紧急数据

选项

0~40

长度可变,最长可达40字节。没有使用时,TCP的首部长度为20字节

最常见的如MSS:数据包每次能够传输的最大数据量(可由通信双方确定)

填充

N

为了使整个首部长度是4bit的整数倍

数据部分

N

如果数据大于MSS,其在传输层就自行分片

3、主要功能

1)面向连接

  • 三次握手:确认双方的传输通道能正常支持传输

  • 四次挥手:前两次挥手双方都接收到对方想要释放连接的请求

       后两次挥手双方都接收到对方准备好释放连接的请求

2)重传机制

  • 超时重传:设有⼀个定时器,当超过指定的时间后,没有收到对⽅的ACK确认应答报⽂,就会重发该数据

  • 快速重传:如果接收方某一次没有收到预定Seq的包却收到了大于其的包,这说明中间有个包丢了,它会一直回复丢了的那个包的ACK,当发送方收到三个序号同样的ACK就直接触发重传,这个过程是比超时重传快的

3)滑动窗口

滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据,用于流量控制、有序接收

  • 流量控制:发送方根据接收方的实际接收能力控制发送的数据量

4)拥塞控制

  • 背景/原因

因为计算机网络处在一个共享的环境之中,所以,发送方发送窗口不一定是因为接收方的调整,还有可能是其他主机之间的通信使得网络发生了拥堵,这个时候发送方如果继续发送大量数据,则会进一步加重网络的负担。形成恶性循环。

所以,发送方的发送速率不仅仅要看接收方的接收能力,还要看整个网络的接收能力。

  • 拥塞窗口cwnd

      是发送方维护的一个状态变量,它会根据网络的拥塞程度动态变化;

      网络中没有出现拥堵,就增大,反之则减小。

  • 拥塞控制四大算法:

      当TCP刚建立一个连接的时候,它并不清楚发送多少数据比较合适,所以有个慢启动的过程,一点点的试探自己能发多少比较合适。发送方每收到一个ACK,拥塞窗口cwnd就+1;拥塞窗口指数增长。

      慢启动门限ssthresh:
    • 拥塞窗口cwnd<慢启动门限ssthresh,使用慢启动算法

    • cwnd>=ssthresh,使用拥塞避免算法

      每收到一个ACK,拥塞窗口只增加1个cwnd。

      一旦发生了重传,即拥塞发生。门限和拥塞窗口都发生变化。
    • 超时重传

    • 快速重传

            1)将拥塞窗口减半。cwnd/=2;

            2)将门限和拥塞窗口相等。ssthresh=cwnd。

            3)开始快速恢复算法

    • 慢启动算法:

    • 拥塞避免算法

    • 拥塞发生算法:

    • 快速恢复算法

          当发生快速重传的时候,你发送方还能收到三个一样的ACK,说明网络情况没有超时重传那么糟糕,此时采取快恢复算法。

          1)拥塞窗口cwnd=ssthresh+3

          2)重传数据

          3)如果收到新数据的ACK说明网络已经恢复,此时门限值恢复重传之前的值,并开始拥塞避免

4、应用场景

1)从对数据准确性要求高的角度(与UDP对比):

  • 文件传输(FTP、HTTP/0.9~2.0)

  • 发送/接收邮件(POP IMAP SMTP

  • 远程登录(TELNET SSH)

  • ...

2)从长连接&短连接角度:

长连接:整个通讯的过程client和server只用一个Socket,从而保持长期的通讯连接。长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。

  • 适用于操作频繁/点对点通讯等连接数不太多的场景,如直播、数据库连接

短连接:每次client向Socket发送请求都会新建一个Socket,当处理完一个请求时就直接关闭掉。

  • 适用于并发量大且用户不需要频繁的交互操作的场景,如Web的http服务

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值