网络 (TCP/IP 四层协议中常见网络协议)

简介: 网络 (TCP/IP 四层协议中常见网络协议)

应用层


DNS (Domain Name System) 域名系统.

DNS 是一整套从域名映射到 IP的系统


NAT 技术

解决 IP 地址不够用的问题. 可以实现私有 IP 和全局 IP 的相互转换

NAPT 技术

使用 IP + Port 唯一确定局域网中的主机


传输层


TCP 协议 (Transmission Control Protocol 传输控制协议)

TCP 协议段格式


6位标志位:

  • URG : 紧急指针是否有效
  • ACK : 确认序号是否有效
  • PSH : 提示接收端应用程序立刻从 TCP 缓冲区中把数据读走
  • PST : 对方要求重新建立连接. 携带 PST 标识的报文称为复位报文段
  • SYN : 请求建立连接. 把携带 SYN 标识的报文称为同步报文段
  • FIN : 通知对方, 连接要关闭了. 将携带 FIN 标识的报文称为结束报文段

紧急指针: 标识哪部分数据时紧急数据

TCP 的确认应答机制(安全机制)

TCP 将每个字节的数据编号, 即序列号.

每一个 ACK 带有对应的确认序号. 代表该序号之前的数据已经发送完毕, 下一次请从该序号对应的数据开始发.

TCP 的超时重传机制(安全机制)

主机 A 给主机 B 发送数据后, 主机 A 为收到确认应答 (ACK), 在一个时间间隔的等待后, 会重传数据

未收到确认应答, 有两种情况

  • 数据丢了: 没有办法, 只能重传数据
  • ACK 丢了: 如果主机 A 重传数据, 主机 B 会收到重复的包, 于是就会根据 序号, 对缓冲区内的数据包进行排序, 去重.

TCP 的连接管理机制(安全机制)

三次握手建立连接, 四次挥手断开连接

滑动窗口 (效率机制)

一收一发效率较低, 因此可以一次发送多条数据 (将多个段的等待时间重叠)

窗口大小 : 无需等待确认应答而可以继续发送数据的最大值 (这里假定窗口大小为 4000)

OS 内核为了维护滑动窗口, 需要开辟发送缓冲区来记录未应答数据 (应答后删除)

窗口越大, 网络吞吐率越高


丢包处理

丢包有两种情况:

  1. ACK 丢了

假设这里的 ACK = 1001 丢了

对于 server 来说, 我已经收到 1~1000 的数据, 不管 1001的ACK有没有被 client 接收到, 当我接收到 1001 ~ 2000 的数据时, 就可以直接返回 ACK = 2001

ACK 的含义是, 确认序号之前数据都已收到, 即对于 2001 的 ACK 来说, 1~2000 的数据都已收到

client 收到 2001的ACK , 即使没有收到 1001 的ACK , 也会默认 1~1000 是发送成功的

部分 ACK 丢失并不要紧, 可以通过后续 ACK 进行确认

  1. 数据包丢了

该机制称为 “高速重发控制” (快重传)


流量控制 (安全机制)

接收端处理数据能力有限, 如果接收端的缓冲区被打满, 发送端仍发送数据, 那么就会出现丢包, 重传等一系列机制

TCP 支持根据接收端的处理能力, 来控制发送端的发送速度, 该机制称为 “流量控制”

  • 接收端将自己剩余的窗口大小, 通过 ACK 中, TCP 首部的 “窗口大小” 和 “窗口扩大因子” 通知给发送端
  • 发送端根据 ACK 中的信息来决定自身的数据发送速度
  • 如果接收端缓冲区已满, 会将窗口设置为 0.
    此时发送端不再发送数据, 而是会定期发送一个 窗口探测数据段, 来获取接收方的窗口大小信息

拥塞机制 (安全机制)

TCP 连接建立初, 如果突然发送大量数据, 就很可能出现问题

处理方式: 慢启动机制

先发送少量数据, 探测网络拥堵状态, 再决定以多大的速度进行数据传输

引入概念 – 拥塞窗口 cwnd

  • 发送刚开始时, 定义 拥塞窗口大小为 1
  • 每次收到一个 ACK, 拥塞窗口大小加 1 (以传输轮次为标准, 其实每一轮拥塞窗口的大小是翻倍的)
  • 每次发送数据时, 将上次 ACK 中缓冲区窗口大小 和 拥塞窗口大小做比较, 取较小值作为实际发送的窗口大小 (实际发送数据的速度)

慢启动的启动速度慢, 但是增长速度快 (指数级别)

引入概念 – 慢启动的阈值 (ssthresh)

  • 当拥塞窗口超过这个阈值时, 将按照线性方式进行增长
  • 当 TCP 开始启动时, ssthresh 等于窗口最大值
  • 每次超时重发的时候, ssthresh 减到当前拥塞窗口大小的一半 (ssthresh = cwnd [网络拥塞时])
    并且拥塞窗口大小, 会置回 1 (cwnd = 1)


延迟应答(效率机制)

接收到数据时, 如果接收数据的主机立刻返回 ACK, 则返回的窗口会较小 (返回过程和新数据的传输过程是需要耗时的, 接收数据的主机已经处理了很多数据). 因此我们可以慢一些再返回数据

此外会对 慢一些 进行限制, 防止太慢让发送端误以为丢包, 进行超时重传了

  • 数量限制: 每个 N 条就返回一次 ACK
  • 时间限制: 超过最大延迟时间 (MSL) 就返回一次 ACK
  • 一般 N 取2, MSL 取 200ms

捎带应答(效率机制)

ACK 随接收端返回的数据一同返回

TCP 的性质 : 大小限制

  • 创建 Socket 时, 同时会在操作系统内核中创建一个发送缓冲区和一个接收缓冲区
  1. 调用 write 时, 会将数据先写入发送缓冲区
  2. 如果发送的数据太长, 会被拆分成多个 TCP 的数据包发出
  1. 如果发送的数据太短, 会在缓冲区等待长度差不多, 或者其他时机再发出
  2. 接收数据时, 数据也是从网卡驱动程序到达内核的接收缓冲区
  3. 应用程序调用 read , 从接收缓冲区拿数据
  • 由于缓冲区的存在, TCP 程序的读写操作不需要一一匹配
  1. 写1000字节的数据, 可以写一次大小1000字节, 也可以写100次大小100的字节
  2. 读同理

粘包问题

包 : 应用层数据包

站在传输层角度, TCP 时一个一个的报文过来的, 按照序号有序排放在缓冲区中

站在应用层角度, 能看到的只是一串连续的字节数据

粘包问题就是接收端无法区分应用层数据包之间的边界, 导致读取多个完整或不完整数据包的问题

解决粘包问题的关键是明确数据包的边界

  • 数据包定长: 按照固定大小读取
  • 数据包变长:
  • 在包头位置约定总包长度
  • 在包与包之间, 使用明确分隔符

TCP 异常情况

进程终止 / 程序重启 : 进程结束时会释放文件描述符, 此时仍可以发送 FIN , 即和正常关闭无区别

机器掉电 / 网线断开 : 接收端会认为连接正常, 仍会进行数据收发

当接收端发数据时, 感知到发送端已断开连接, 就会触发 reset

如果接收端不进行发数据操作, 也会有保活机制定期检测对方的状态

基于 TCP 的应用层协议

HTTP / HTTPS / SSH / Telnet / FTP / SMTP


UDP 协议

UDP 特性 : 面向数据报

应用层交给UDP多长的报文, UDP 原样发送, 既不会拆包, 也不会合并


基于 UDP 的应用层协议

NFS / TFTP / DHCP / BOOTP / DNS

TCP 和 UDP 的应用场景

  • TCP 用于可靠传输情况. eg: 文件传输, 重要状态更新 …
  • UDP 用于高速传输, 对实时性要求高的通信领域. eg: 广播, 视频传输, 早期 QQ

网络层


网络层协议进行路径选择

IP 协议

协议头格式


标识: 唯一标识 主机发送的报文. 同一报文在链路层的分片 标识相同 (id 相同)

3位标志字段

  • 保留
  • 禁止分片 (1 – 禁止)
  • 更多分片 (类似于结束标志, 0 – 结束)

分片偏移: 分片相对于原始 IP 报文开始处的偏移

生存时间 TTL: 数据到达目的地的最大报文跳数

协议: 表示上层协议是什么


数据链路层

以太网

以太网是一种技术标准, 应用于数据链路层和物理层, 而不是一个具体的网络

以太网帧格式

地址: MAC 地址

类型: 分为三种

  1. IP
  2. ARP
  3. PARP

MTU 最大传输单元

不同数据链路层对物理层, 产生不同的限制

如果一个数据包从以太网 路由到 拨号链路上, 数据包长度大于 拨号链路的 MTU, 则数据包就要进行分片操作


ARP 协议

介于网络层和数据链路层之间的协议

作用: 建立主机 IP 和 MAC 地址的映射关系

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
8月前
|
域名解析 网络协议 安全
计算机网络TCP/IP四层模型
本文介绍了TCP/IP模型的四层结构及其与OSI模型的对比。网络接口层负责物理网络接口,处理MAC地址和帧传输;网络层管理IP地址和路由选择,确保数据包准确送达;传输层提供端到端通信,支持可靠(TCP)或不可靠(UDP)传输;应用层直接面向用户,提供如HTTP、FTP等服务。此外,还详细描述了数据封装与解封装过程,以及两模型在层次划分上的差异。
1962 13
|
9月前
|
网络协议
TCP/IP与OPC协议的深度比较
总的来说,TCP/IP和OPC协议各有其优点和应用场景。TCP/IP协议是网络通信的基础,而OPC协议则是工业自动化领域的重要工具。在实际应用中,我们需要根据具体的需求和场景,选择合适的协议。
375 11
|
10月前
|
网络协议 物联网
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
390 12
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
373 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
11月前
|
网络协议 测试技术 Linux
Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库
gev 是一个基于 epoll 和 kqueue 实现的高性能事件循环库,适用于 Linux 和 macOS(Windows 暂不支持)。它支持多核多线程、动态扩容的 Ring Buffer 读写缓冲区、异步读写和 SO_REUSEPORT 端口重用。gev 使用少量 goroutine,监听连接并处理读写事件。性能测试显示其在不同配置下表现优异。安装命令:`go get -u github.com/Allenxuxu/gev`。
286 0
|
网络协议
TCP报文格式全解析:网络小白变高手的必读指南
本文深入解析TCP报文格式,涵盖源端口、目的端口、序号、确认序号、首部长度、标志字段、窗口大小、检验和、紧急指针及选项字段。每个字段的作用和意义详尽说明,帮助理解TCP协议如何确保可靠的数据传输,是互联网通信的基石。通过学习这些内容,读者可以更好地掌握TCP的工作原理及其在网络中的应用。
|
网络协议
网络通信的基石:TCP/IP协议栈的层次结构解析
在现代网络通信中,TCP/IP协议栈是构建互联网的基础。它定义了数据如何在网络中传输,以及如何确保数据的完整性和可靠性。本文将深入探讨TCP/IP协议栈的层次结构,揭示每一层的功能和重要性。
970 5
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
499 3
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
281 13
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
1262 3