传输层——TCP协议(1)

本文详细解析了TCP协议的工作原理,包括数据在不同层次的名称、TCP报文格式、确认应答机制、序号和确认序号的作用,以及超时重传和去重策略,强调了TCP面向连接、可靠的特性。
摘要由CSDN通过智能技术生成

数据在TCP/IP的体系结构中各层的名字不一样,在应用层称其为请求或响应,在传输层称其为数据段,在网际层称其为数据报,在链路层则称其为数据帧。

TCP协议(Transmission Control Protocol)

TCP全称为传输控制协议。我对它的理解是一种具有发送和接收缓冲区的可进行全双工通信的可以控制数据发送的协议。

TCP协议报文格式 

  • 16位源/目的端口:表明数据从哪来,到哪去
  • 32位序号:保证数据按序到达。
  • 32位确认序号:收到的数据报序号加一。
  • 4位首部长度:TCP标准报头(20字节)+选项的长度,TCP头部最大长度是15 * 4 = 60字节
  • 6位标志位:客户端与服务器在进行TCP通信建立连接,正常数据通信,TCP断开连接时都需要发送TCP报文,而这些报文都是要有“类型”的,因为服务器要根据这些报文类型做出不同的动作,因此设计了6位标志位来区分不同的TCP报文

       URG: 紧急指针是否有效(特殊情况下使用)
       ACK: 确认号是否有效
       PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
       RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
       SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段

  • 16位窗口大小:TCP有发送缓冲区和接收缓冲区,而对于发送方来说,发送的速度由对方接收缓冲区中剩余空间大小决定,因此在报头中要填自己接收缓冲区中剩余空间的大小。其本质是进行流量控制,不至于造成因对方接收缓冲区太小而丢弃大量报文。
  • 16位校验和: 发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP首部, 也包含TCP数据部分.
  • 16位紧急指针: 标识哪部分数据是紧急数据(偏移量),在TCP报文中只允许一个字节是紧急数据
  • 6位保留字段和选项不谈。

关于序号和确认序号

  • 为什么确认序号要加一

        为了提高发送效率,发送缓冲区一次发送多个带有序号的数据报,而确认序号表示确认序号之前的数据已经全部收到了,因此允许有少部分的应答丢失,下一次发送的数据从确认序号指定的数字开始发送。确认序号是给应答编号的。

  • 为什么要有序号

       从用户层拷贝下来的数据是在TCP发送缓冲区中一个字节一个字节陈列,那么每个字节天然都会有编号(数组下标),那么序号就是数据块发送的最后一个字符下标。发送缓冲区一次发送大量数据报,为了保证数据报安全有序到达,给每个数据报设置了序号。数据按序到达也是可靠性的一种表现。在超时重传中可以根据序号来进行去重。

  • 为什么要同时有序号和确认序号
  1. 当客户端或服务器进行捎带应答时,它既携带了确认序号,也同时发送了携带序号的数据,那么这时候序号和确认序号需要同时存在;
  2. TCP是可以进行全双工通信的,客户端给服务器发送消息,而服务器也可以给客户端发送消息,双发地位对等,因此要有序号和确认序号。

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

确认应答机制

确认应答机制是保证TCP可靠性的核心。

在TCP协议中,当发送端的数据达到接收主机时,接收端主机会返回一个已收到消息的通知,这个消息叫做ACK(确认应答)。

比如说我给我的好朋友发消息,“刚睡醒”不仅表达了我不想玩的意思,还对他给我发的消息进行了确认。

一般来说,我们发送的消息都会收到应答,但是最新的一条消息是没有应答的,因此无法保证发出的消息100%可靠。世界上也没有100%可靠的网络,但是我们可以保证局部上只要收到应答的历史消息一定是被对方收到的结论。

TCP通过ACK实现可靠的数据传输。当发送端将数据发出之后会等待对端的确认应答,如果有确认应答,说明数据已经被成功收到,如果没有,那么数据就没有成功到达。

超时重传机制

当主机A给主机B发送消息时,不管是丢包还是确认应答丢失,只有在A收到确认应答后才知道清楚情况——报文被收到了,其他情况不清楚,如果没收到应答,它不可能一直等,于是设置了一个特定的时间间隔,超过这个时间还没有收到确认,就重新发送报文,这就是超时重传机制

 主机对于发出的报文是否丢失,无法判定,所以必须通过规定,表征是否重传。 

对于确认应答丢失的情况,发送方要进行重传,那么接收方就会收到重复的报文。而重复的报文也是不可靠表现的一种,因此要进行去重——根据序号去重。

 那么超时的时间如何确定呢?

  • 最理想的情况下, 找到一个最小的时间, 保证 "确认应答一定能在这个时间内返回",但是这个时间的长短, 随着网络环境的不同, 是有差异的.
  • 如果超时时间设的太长, 会影响整体的重传效率;
  • 如果超时时间设的太短, 有可能会频繁发送重复的包;

TCP为了保证无论在任何环境下都能比较高性能的通信, 因此会动态计算这个最大超时时间

  • Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时时间都是500ms的整数倍.
  • 如果重发一次之后, 仍然得不到应答, 等待 2*500ms 后再进行重传.
  • 如果仍然得不到应答, 等待 4*500ms 进行重传. 依次类推, 以指数形式递增.
  • 累计到一定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值