TCP 协议 self-opinion

基本常识 :

  • ip :用于确定网络中的一台设备;
  • 网卡 : 计算机上用于网络信息交换的的I/O设备;
  • Socket :java 对网卡的抽象;
  • 端口 : 为了数据准确的在进程之间传输,为需要网络资源的进程配置专门的端口;//可以理解成快递 发送到了你的小区(ip),但要到达你的手上要知道你家住那个房子(端口)。
  • 进程 : 在计算机中运行着的程序,一个进程可以对应多个端口,但一个端口最多对应一个进程;

网卡的(逻辑:我认为的)结构

  1. 一块内存,(主要)用于数据缓冲;
  2. 一个接口,同进程之间数据交互;
  3. 一个程序,用于校验数据的完整性,正确性;
  4. 一个控制器,管理网卡的资源;

TCP 是啥:

  • TCP 是一个由大佬们规定的网络传输的协议;
  • 是网络中数据传输的规范;
  • TCP 是面向字节流的网络数据传输协议;

TCP 的特点:

谈论TCP 的特性,需要介绍一下另外一个传输协议;
UDP : 面向数据包的传输协议,特点是,无连接(类似与早期村口的广播,收到了就是收到了,收不到也不会再次重传,不要求连接)、不可靠(可能丢包,丢包就丢了,不会重新发的)、面向数据报(类似与肥料运输,一包一包的 传输);

相对与UDP ,TCP 具有:

  • 稳定; (10个机制导致 )
  • 可靠; (10个机制导致 )
  • 面向字节流;

TCP 协议格式:

在这里插入图片描述
解释 :

  • 源/目的端口号 : (源) 数据出自那个进程,(目的)数据要去哪个进程;

  • 32 位序号/32位确认序号:TCP 将每个字节的数据都进行了编号,即为序列号;接受端收到数据报会创建一个新的TCP数据报,并将其ACK 位置 1 ,并写入确认序号(表示之前的数据已经收到,下一次发送数据从那个序列号开始发送),再将这个TCP 数据报发送到发送端。通常我们称 这个数据报的名字叫 ACK ;

  • 4位TCP 报头长度:表示改TCP头部有多少个32 位bit(多少个int);所以TCP 头部最大长度是2^4 * 4 个字节的长度;

  • 6 个标志位: 根据标志位 有效性 可以确定TCP 传输的是什么类型的数据报;

    • (1)URG : 紧急指针是否有效 (有效当前位为 1);
    • (2)ACK : 确认号是否有效;
    • (3)PSH :提示接收端应用程序立刻从TCP缓冲区将数据读走(类似生产者消费者模式);
    • (4)RST : 对方要求重新建立连接;把携带RST标识的数据报文称为“复位报文段”;
    • (5)SYN : 请求建立连接;把写下SYN标识的数据报称为“同步报文段”;
    • (6)FIN : 本端关闭通知标识,通知对方本端准备要关闭了;把携带FIN标识的数据报称“结束报文段”;
  • 16 位窗口大小 :流量控制机制的信息。(在流量控制机制详细解释);

  • 16 位校验和 :由发送端写入,用于校验数据报的正确性(包括TCP 头部以及数据),当校验结果与发送端写入的校验和不同,则说明数据损坏;

  • 16 位紧急指针 : 标识那部分数据是紧急数据;

  • 40 字节头部选项 :(暂时还没学习到,待到学习到了补充~ 这里放一个定时器~);

TCP 的机制

1.确认应答(ACK)机制

  • 由于 TCP 每个数据报都 将其每一个字都编号了,也就是说 当发送端将 TCP数据报 发送到 接受端,如果接受端成功收到这个数据报,则会给发送端给以回应,即发送一个ACK 并 在确认序号中写入下一次希望发送的数据是从那个序列号开始;
    在这里插入图片描述

2.超时重传机制

  • 在主机之间发送数据时,有可能出现一些网络问题,导致 主机 A 给 主机B 发送的数据丢了,主机B 没接收到 主机A 发来的数据,因为应答机制的原因 主机A 没有接受到主机B 的回应,于是主机A 会 等待一段时间 如果 主机B 还是没有回应,那么主机A就会重新发送数据;
    在这里插入图片描述

连接管理机制(三次握手,四次挥手)

  • 正常情况下 TCP 要经过三次握手建立连接,四次挥手断开连接;

三次握手建立连接解释:

  • 例如主机 A 与 主机B 要建立连接 ,在建立连接之前首先(两台主机)要确定建立连接的双方有无数据发送和接收的能力,此时 主机A 向 主机B 发送 SYN (建立连接的数据报 即,这个数据报中没有主要的数据 只有 一个SYN 位置 为1),只有当 主机B 有接收TCP 报文能力的情况下才可能接收到主机A 发送的SYN ,(如果确认主机B 的接收能力没有问题,但可能是网络原因没有收到 ,就会由 超时重传机制保证接受的可能 ),当主机B 接收到了 主机A 的 SYN 则,主机B 可以知道,主机·A的发送能力没有问题 主机B 自己的接收能力没有问题, 接下来 由于应答机制 主机B 向 主机A 发送 SYN + ACK ,如果主机B 的发送能力没有问题,且主机A 的接收能力没有问题,则 由 超时重传机制 保证成功接收, 当主机A 接收到了主机B 的SYN + ACK 时 主机A 已经确认双方的通信正常 ,但主机B 此时并不知道 自己的 发送能力 和 主机A 的接收能力是否ok,所以,主机A 会 发送 ACK 给主机 B,当主机 B 收到 主机A 发送的 ACK ,主机B 也确认双方发送和接收能力ok ,双方算是建立了连接,接下来就可以数据交互了;
    在这里插入图片描述

四次挥手 解释

  • 当主机A与主机B之间完成了数据交互 ,双方需要进行连接的断开操作;
  • 此时 主机 A(此时主机A 在 FIN_WAIT1 状态) 会向 主机 B 发送 FIN (断开连接的亲求),当主机B 收到主机A 发送的 FIN 由于 应答机制主机B 发送给主机A 一个 ACK (表示我知道了),当主机A 收到 主机B 的 ACK 会处于FIN_WAIT2 (准备断开等待状态), 此时主机 A 已经确认双方可以关闭,当主机B 处理完数据缓冲区的内容,向主机A 发送 FIN ,并等待主机A回复 ACK,当主机B 接收到 主机A 发来的ACK 双方连接断开;
  • 在这里插入图片描述

滑动窗口

  • 目的 在稳定性的前提下,要尽可能的提高效率;
  • 方式 : 发送数据报时,一次性发送多组数据报,并建立相应的ACK 响应窗口,一但窗口中的序列号被响应了,则可以向后滑动窗口 ;
  • 当发送途中出现了 数据丢包或响应丢包,发送端会根据响应端的响应消息,决定下次发送那个数据报,以及超时重发,由于每个网卡都有缓冲区域(我的物理模型),并且发送的所有数据字节都有序列号,因此,TCP 有良好的去重能力,即发送的数据包被重复接收没有啥影响,并且能准确的解决 先发后至问题,对于中间丢包也能完美的要求重发;

流量控制

考虑到接收端的对接收数据的处理能力有限,如果发送端不停的发送,导致接收端的缓冲区被用完,这个时候如果继续发送,很大概率会丢包以及一系列问题!
因此TCP 协议支持,根据接收端的处理能力来决定发送端的发送速度(滑动窗口的大小) 这个机制就叫做流量控制!(类似于生产者消费者模式!)
接收端可以将自己接收的缓冲区大小放入TCP 首部的窗口大小字段,通过ACK端通知发送端;
窗口大小由网络和缓冲区决定,取二者中小的那个;
接收端会根据自己缓冲区剩余大小发送ACK通知发送端 发送端接收到这个ACK 会调节窗口大小并更改发送速度!
如果接收端的缓冲区满了,接到 ACK 的发送端就将窗口大小赋值为0 不会再向接收端发送数据,但会定期发送探测包,询问何时可以继续发送!

拥塞控制

因为网络环境千变万化,有时十分拥堵,有时很顺畅,就像大城市的公路一样,上下班十分拥堵,中间不是特别拥堵,为了适应网络环境TCP 连接建立后,不直接把大量数据发送,而是发送少量数据报,根据响应情况,确定网络环境,当网络环境好的时候,也就是网络很快的时候,增大滑动窗口的大小;(当然 滑动窗口的大小主要依靠 流量控制 和拥塞控制 取二者的最小值!);

延迟应答

为了保证稳定的同时提高传输效率,即想要让滑动窗口尽可能的大,
控制滑动窗口大小一个可控的就是,尽量让接收端的缓冲区尽可能的大,当数据在缓冲区未被进程取走,缓冲区会被占用,当进程取走数据,缓冲区就会恢复一定大小,为了让滑动窗口尽量大,即等一会应答,等进程将数据取走后,再应答,返回较大的缓冲区大小,从而影响滑动窗口的大小!

捎带应答

就是ACK 搭个顺风车,两台主机通信互相发送接收数据,由于确认应答机制,每次数据发送到接收端,接收端都要回一个ACK 表示接收到了,为了提高效率,干脆在数据互相发送的时候捎带上ACK信息;

面向字节流

即 可以接收也可以发送,且相互不影响!(读有读的缓冲区,写有写的缓冲区);

粘包问题

因为在TCP 协议中没有报文长度描述,但是又序号这样的字段;
面对发送的数据是按照序号排列在缓冲区,当进程取数据是就不知道从哪里到哪里是自己要的数据!

  • 解决方案:
    对于定长的包,保证每次按固定大小读就可;
    对于变长的包,可以在包头位置约定一个包总长度的字段,从而确定包的结束位置!
    对于变长的包,也可以明确制定定应用层的协议来划分包的范围!

保活机制

  • 当进程终止,会释放文件描述符,任然可以发送FIN ,相当于正常的断开连接!(机器重启同样!)
  • 机器掉电/直接网线被人拔了 : 当连接中对方是处于写状态,长期没有得到响应,就会亲求重连reset,即使没有写操作,TCP 内置了保活定时器,会定期发送探测包确认对方是否还在,如果对方不在,就释放连接!
  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值