ssh协议是osi_TCP/IP 协议模型

TCP/IP 与OSI 七层模型

42ea5c7b220083b48a111f839c460c5d.png

以上为 网络OSI 七层协议模型

  • 物理层
    • 网络传输中最底层负责数据传输的物理硬件, 这里相当与以太网或者电话线等物理设备,可以模糊定义其为数据传输过程中的实际物理媒介
  • 数据链路层
    • 数据链路层, 利用以太网中的数据链路进行通信, 属于接口层, 主要为常见的网卡驱动程序, 起到操作系统和硬件之间的桥梁作用, 计算机上的网卡等相关外设不是直接插入就可以使用, 还需要对应的网卡驱动程序.
  • 网路层
    • 网络层中协议, 互联网中基于IP地址转发包数据
    • ICMP, IP数据包仔发送途中一旦发生异常, 导致无法达到对短目标的时候需要给发送端发一个异常通知, ICMP 为这一功能定制, ping 便是基于ICMP
    • ARP从分组数据包的IP地址中解析出MAC地址
  • 传输层
    • 传输层的最主要的功能实现应用程序之间通信, 计算机之间运行着多个程序,因此必须要分清哪些进程在进行通信, 识别这些通信的凭证是端口号
    • TCP 是面向链接的传输层协议,保证两端主机间的通信可达, 并正确处理传输中的丢包, 包乱序等情况, 后续展开详解
    • UDP 与TCP 不同, 面向无链接的协议, 不关心对方是否真实的受到了数据, 常用于广播通信,视频通信等
  • 会话层及往上的协议
    • http/ssh/telnet/smtp/ftp 等具体应用APPLICATION

基于IP/TCP 的包传输data封装

a7e070830b2bfb623114629635943ed7.png
data 传输过程中的层层封装

TCP 协议详解

  • 通俗概念: TCP 是一种面相连接的可靠传输协议, 只有在确认对端通信正常的情况下才会发送数据包
  • TCP 报文格式

3b01c12808d50fc34660f7dd0e80b3c2.png
TCP 报文格式图
    • 32bit, 出去保留项的格式, 总体长度为20字节, 加上保留项最大不超过60字节
    • 源端口:16bit, 位指名报文返回端的端口号
    • 目的端口: 16bit, 端口指明接收方计算机上的应用程序接口
    • 序列号: 32bit, 表明本报文段第一个字节的序号,用来保证数据传输的有序性, 稳定传输的关键部分
    • 数据偏移: 4bit, 因为TCP 头部还有保留项的内容, 故TCP 头部长度是不定的, 定义偏移量来表明TCP 头部最终的长度, 最大值 1111 = 1 + 2 + 4 + 8 = 15, 15 * 32 / 8 = 60, 也就表明TCP 头部最大不超过60字节
    • 保留: 6bit, 暂时为0 , 保留为新功能时使用
    • URG: 1bit, 紧急指针标志, 为1时表示紧急指针有效,为0则忽略紧急指针
    • ACK: 1bit, 确认标志, 1 有效, 0 忽略
    • PSH: 1bit, 带有PUSH的数据, 接收方获取到数据后, 应该立即交给应用程序, 而不走缓冲
    • RST: 1bit, 连接重置接口, 由于外部原因导致连接奔溃, 或者遇到非法字段的时候, 进行重连的接口
    • SYN: 1bit, 建立连接, 1时表明要建立连接
    • FIN: 1bit, 释放l连接, 1时表明要断开连接
    • 窗口: 16bit, TCP 窗口,最大值65535, 即表明TCP 窗口最大支持65535
    • 校验和: 16bit 对整个报文(包含头部), 发送端进行计算, 并由服务端验证
    • 紧急指针: 16bit, URG 生效(置为1时), 该值也是一个偏移量, TCP 紧急发送
    • 保留项: 可选数据内容, 具体长度由${偏移量} - 20字节决定, 最大长度时60字节
    • 数据: TCP 报文中承载的用户数据, 可以为空, 如HTTP/FTP
  • 建立稳定连接:三次握手
    • TCP是面向连接的可靠传输协议, 所以为了保证能够有稳定连接, 客户端和服务端需要通过三次通信过程来确认客户端和服务端已经建立了稳定连接, 具体过程如下:

2f795f3ed7e0442352dff4172b0038d6.png
三次握手
  • 稳定断开连接: 四次挥手

a987ae5f7fdfdba03c44c1b27a634aa1.png
四次挥手
  • 连接状态: [如上图展示]
    • 客户端状态转换:
      • 建立连接时: CLOSED->SYN_SENT->ESTABLISHED
      • 断开连接时: FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
      • 客户端在断开连接时会在TIME_WAIT 状态中持续2MSL(最大报文段生存时间), 之后将状态切换为CLOSED
    • 服务端连接状态转换
      • 建立连接时: CLOSED->LISTEN->SYN_RECEIVED->ESTABLISHED
      • 断开连接时:CLOSE_WAIT->LAST_ACK->CLOSE
  • 问题:
    • 为什么要三次握手而不是两次?
      • 由上面的三次握手的图可以知道, 在两次握手后, 服务端已经连接准备就序, 但是服务端还需要知道客户端已经连接就绪, 即第三次握手, 这样才能保证有效连接
    • 为什么要四次挥手?
      • 在连接状态下, 如果客户端要和服务端断开连接, 为了保证数据不丢失, 服务端只能先给客户端发送一个ACK, 因为这个时候不能确定服务端给客户端需要传输的所有数据已经传输完毕, 所以不能立即关闭, 等待服务端确认所有数据发送完毕, 这个是时候才能给客户端发送断开连接的请求, 并等待确认关闭连接
    • 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
      • 发送中, 要一定程度的确保服务端在确认断开连接的ACK 发送给服务端成功, 如果立即断开连接, 服务端很肯能收不到关于FIN的ACK , 这个时候服务端可能hang在LAST_ACK, 并不断的给客户端发FIN。2MSL是报文的最大存活时间, 如果这个时间还能收到FIN, 说明上个ACK发送失败, 需要重发
  • 消息可靠性: 序列号+ 确认应答
    • 当发送端发送数据到达目的主机时, 目的主机会返回一个已收到的消息通知(ACK), 这个返回机制叫确认应答, 同时返回下一个需要接受的数据的序列号,证明当前数据已经接受准确, 使客户端能确认该块数据已经被成功发送,避免不断重复发送的情况

2a8eec134eff0c046ed4d08e334dd361.png
服务端与客户端进行正常连接
    • 在正常的连接中, TCP 通过确认应答 + 对应的序列号, 来保证每个数据包都成功的发送给服务端, 服务端也能保证每个数据都发送到服务端

a9d326460e5264d4d1e7173dd31d3bd9.png
客户端数据丢失的情况
    • 当客户端传输数据出现丢失的情况时, 服务端没能收到客户端传输的数据包, 同时客户端在一段特定的时间间隔内没有收到客户端反回来的确认应答,这个时候客户端尝试重新发送数据給服务端, 服务端在收到客户端的数据后进行返回给客户端, 保证该数据包能够正常传输

0e4737639eb40c46146ffbda95b861bf.png
服务端确认应答丢失情况
    • 当客户端能正确的把数据发送给, 服务端, 服务端在返回数据的时候出现了丢包的情况, 此时客户端会在一定的时间间隔内没有收到服务端返回的确认应答, 客户端认为当前数据出现了丢包, 此时客户端尝试再次重新发送数据給服务端,服务端应答給客户端保证数据稳定传输
    • 一定的时间间隔: 上文说到有一定的时间间隔, 如果没有一定的时间间隔的话,会引起客户端大量数据重发, 同时会导致网络拥堵极端情况下可能造成网络奔溃, 在Unix系统中, 超时都是一0.5 位单位进行控制, 超时后收不到应答, 则进行再次发送, 此时应答时间会以2, 4倍的指数形式增长, 同时数据不会无限的重发, 到达一定的充实次数后。如果还是没有收到任何应答, 则判定网络或者对端主机发生了异常, 强制关闭连接, 并通知应用程序通信异常, 连接终止.
  • 传输效率控制: 滑动窗口 + 拥塞控制
    • 在上面的描述中, 消息传输时通过确认应答来保证每次数据完成传输, 当上一个数据块完成传输并确认后才会继续传输下一个数据包, 很显然这是一个串行的传输结构, 实际TCP中为了提高传输速率, 引入了窗口控制的机制
    • 窗口控制的基本原则是一次并行发送多个TCP数据包, 等待服务端去确认应答, 在服务端完成确认应答后再次发送多个TCP数据包, 其中一次发送数据包的个数就是窗口大小, 如下图展示的窗口大小为4:
    • 假定一个数据传输的窗口大小为4, 前三个数据包已经收到来自服务端的确认应答, 那么此时还有第四个数据包在等待应答, 此时窗口的位置可以移动到等待确认应答的位置, 从而提高效率, 该机制也被叫做滑动窗口机制

1c292f1986c4c5abecaece9d3a06b60b.png
TCP 滑动窗口

注:在窗口控制中, 如果1,2,3,4,窗口最后以个之前的某个数据发送没有确认应答, 那么后面的也不会重发, 但是当某一段报文丢失后, 客户端会一直收到丢失报文的前一个序列的报文的应答, 用来告诉客户端服务端真实需要的数据, 如果连续收到三次相应的确认应答, 将会对其所在的报文进行重发。

    • 拥塞控制
      • 拥塞控制是TCP在数据传输过程中, 通过调整窗口大小获取最佳传输速率的一个过程, 如果太大可能会造成网络拥堵, 如果太小怎传输速率不佳
      • TCP 为了防治出现该类问题, 通过慢启动的算法得出最佳窗口值
      • 慢启动解释: 为了调节所要发送的数据量, 定义了拥塞窗口的概念, 在慢启动时, TCP将窗口设置为1个数据段(1MSS), 之后每收到一次确认应答, 窗口值+1, 在客户端发包时, 将拥塞窗口的大小和接收端主机通知的窗口大小比较, 选取较小的值, 此时会触发拥塞窗口指数指数级增长, 为了防止这个问题, 在引入慢启动阈值的概念, 只要拥塞窗口的值超过这个阈值, 后续每次收到确认应答时, 只能按照特定比例放大窗口: 1个数据段的字节数/ 拥塞窗口(字节) * 1个数据字节的个数, TCP在通信开始的时候没并没有设置这个值,在触发超时重发的时候会将阈值设置为拥塞窗口一般的大小
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值