【网络原理】TCP/IP 协议栈

本文重点:

  • 理解传输层的作用,深入理解 TCP 的各项特性和机制
  • 对整个 TCP/IP 协议有系统的理解
  • 对 TCP/IP 协议体系下的其他重要协议和技术有一定的了解
  • 本文的知识点是网络编程的理论基础
  • 是一个服务器开发程序员的重要基本功
  • 是整个网络知识中重点难点 ,也是各大公司笔试面试的核心考点

文章目录

  • 引言
  • 一、应用层
  • 二、传输层
    • [2.1 端口号](#2.1 端口号)
      • 端口号范围划分
        • [认识知名端口号(Well-Known Ports)](#认识知名端口号(Well-Known Ports))
    • [2.2 UDP 协议(User Datagram Protocol,用户数据报协议)](#2.2 UDP 协议(User Datagram Protocol,用户数据报协议))
      • [UDP 数据报格式](#UDP 数据报格式)
      • [UDP 协议特点](#UDP 协议特点)
      • [基于 UDP 协议的应用层协议](#基于 UDP 协议的应用层协议)
    • [2.3 TCP 协议(Transmission Control Protocol,传输控制协议)](#2.3 TCP 协议(Transmission Control Protocol,传输控制协议))
      • [TCP 协议格式](#TCP 协议格式)
      • [TCP 协议特点](#TCP 协议特点)

引言

TCP/IP 协议栈是互联网通信的基石,它定义了一套分层协作的通信规则,确保数据能够在复杂的网络环境中可靠、高效地传输。

协议栈的分层体系

TCP/IP 协议栈通常简化为四层模型,自下而上 分别为数据链路层网络层传输层应用层

每一层都负责不同的通信任务,并依靠下层的服务完成自身工作。

层次 核心职责 关键协议
应用层 满足用户具体业务需求 HTTP、DNS、FTP、SMTP 等
传输层 负责数据从发送端到接收端的端到端传输 TCP(可靠)、UDP(不可靠)
网络层 在复杂网络中选择路径并管理地址 IP、ICMP、ARP
数据链路层 在同一链路节点间传递数据帧 以太网、PPP

一、应用层

应用层直接面向开发者和最终应用,提供满足业务需求的通信接口。

常见协议如:

  • HTTP/HTTPS
  • SSH
  • Telnet
  • FTP
  • SMTP

这些应用层协议构成了日常网络应用的入口。

应用层协议之下,传输层(如TCP/UDP 协议)负责可靠性与传输控制,应用层只需实现自己的业务语义。

DNS 等服务在应用层实现域名解析等功能,底层通常通过UDP/ TCP进行请求和响应。

在网络编程中,应用层协议API(如Java、Python、C/C++ 的 socket 接口)用于实现业务逻辑;理解下层协议对设计高效、鲁棒的网络程序至关重要。

二、传输层

传输层的任务是:保证数据能够从发送端传输到接收端 。传输层也是网络编程的核心,提供两种传输方式:可靠的 TCP高效的 UDP

2.1 端口号

端口号(Port)标识了一个主机上进行通信的不同的应用程序(不同应用程序的端口号都各不相同)。

在 TCP/IP 协议中,用 "源IP"、"源端口号"、"目的IP"、"目的端口号" 以及 "协议号" 这样的 五元组 来标识一个通信(可以通过 netstat -n 来查看)。

端口号范围划分

  • 0~1023:知名端口号(Well-Known Ports)
    • 分配给广泛使用的服务,如 HTTP(80)、HTTPS(443) 等这些广为使用的应用层协议。
    • 这些端口通常需要管理员权限才能绑定,并且他们的端口号都是固定的、公认的。
  • 1024~49151:注册端口号(Registered Ports)
    • 供用户或应用程序注册使用,不是操作系统自动动态分配的。
    • 许多数据库(如 MySQL 3306)、应用服务器(如 Tomcat 8080)会使用这个范围内的端口。
  • 49152~65535:动态/私有端口号(Dynamic/Private Ports)
    • 通常由操作系统动态分配给客户端程序作为源端口,用于发起连接,也称为临时端口。
认识知名端口号(Well-Known Ports)

有些服务器是非常常用的,为了使用方便,人们约定一些常用的服务器,都是用以下这些固定的端口号:

  • SSH 服务器:22
  • FTP 服务器:21
  • Telnet 服务器:23
  • HTTP 服务器:80
  • HTTPS 服务器:443

我们自己写一个程序时,如果要使用端口号,应该避免这些知名端口号。

  • 一个进程是否可以绑定多个端口号?

    • 可以。
  • 一个端口号是否可以被多个进程绑定?

    • 不可以(除非设置 SO_REUSEADDR 特殊情况,通常不允许)。

2.2 UDP 协议(User Datagram Protocol,用户数据报协议)

UDP 就像寄信------ 写好的信就是数据包,当贴上邮票、放入邮筒中之后,你不知道它是否能成功送到目的地。

UDP 数据报格式

偏移量 (位) 字段名称 长度 作用说明
0-15 16位源端口号 2字节 发送方进程端口号。如果是客户端,通常由操作系统动态分配(1024-65535);如果是服务端,则是知名端口(如DNS的53)。
16-31 16位目的端口号 2字节 接收方进程端口号。用于在目标主机上找到对应的应用程序。
32-47 16位UDP长度 2字节 整个UDP数据报(首部 + 数据)的总长度,单位是字节。最小值为8(只有首部,无数据),最大值为65535(即64KB)。
48-63 16位校验和 2字节 用于检测数据在传输过程中是否损坏。如果校验和出错,接收端会直接丢弃该数据报。
  • 16 位 UDP 长度表示整个数据报(UDP 首部 + UDP 数据)的最大长度。
  • 如果校验和出错,就会直接丢弃。

UDP 协议特点

  • 无连接:知道对端的 IP 和端口号,可以直接进行传输,不需要建立连接
  • 不可靠:没有确认机制,没有重传机制;如果因为网络故障导致该段无法发送到对方,UDP 协议层也不会给应用层返回任何错误信息
  • 面向数据报:不能够灵活地控制读写数据的次数和数量。应用层交给 UDP 多长的报文,UDP 会照样发送,既不合并也不拆分
  • 长度限制:最大长度是 16 位(即 64KB),如果 UDP 的总长度超过 64KB,应用层必须手动分包、多次发送,接收端必须手动组包
  • 常见场景:DNS 查询、实时音视频(RTP)、游戏数据(容忍丢包,追求低延迟)

基于 UDP 协议的应用层协议

  1. NFS:网络文件系统
  2. TFTP:简单文件传输协议
  3. DHCP:动态主机配置协议
  4. BOOTP:启动协议(用于无盘设备启动)
  5. DNS:域名解析协议

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

TCP 协议是互联网最复杂的协议,它通过一系列精巧的机制,在不可靠的 IP 网络上提供了可靠的字节流传输。

TCP 协议格式

  • 源/目的端口号:表示数据是从哪个进程来,到哪个进程去
  • 32位序号/32位确认序号
  • 4位 TCP 报头长度:表示该 TCP 首部有多少个32位bit(即有多少个4字节),TCP 首部最大长度是 60(15 * 4)
  • 6位标志位
    • URG:紧急指针是否有效
    • ACK:确认号是否有效
    • PSH:提示接收端应用程序立刻从 TCP 缓冲区把数据读走
    • RST:对方要求重新建立连接,称为复位报文段
    • SYN:请求建立连接,称为同步报文段
    • FIN:通知对方本端要关闭了,称为结束报文段
  • 16位窗口大小
  • 16位校验和:发送端填充,CRC校验;接收端校验不通过,则认为数据有问题。此处的校验和不光包含 TCP 首部,也包含数据部分
  • 16位紧急指针:表示哪部分数据是紧急数据
  • 40字节头部选项

TCP 协议特点


文章到这里就告一段落了,若有错误请尽管指出~

相关推荐
++==1 小时前
RPC:grpc的使用与安装、server和client的使用示例、lsb_relese、自定制协议(LVC)+protobuf的RPC调用框架的实现
网络·网络协议·rpc
luj_17681 小时前
虚实交融中的真实人物塑造
c语言·开发语言·网络·经验分享·算法
青瓦梦滋2 小时前
NAT技术
linux·服务器·网络·网络协议·tcp/ip
RobinDevNotes2 小时前
RoCEv2如何扛起大模型训练网络
linux·网络·ai·网络linux
G佳伟3 小时前
宝塔面板打不开且 Bt-Panel 未运行:从 HTTP 502 到 gevent 缺失的完整排查与修复
网络协议·http·php
keyipatience3 小时前
IP网络层
服务器·网络·网络协议·ubuntu·http
白狐_7983 小时前
408 计算机网络|HTTP 的 RTT 怎么数:用多道题讲清楚
网络协议·计算机网络·http
Discipline~Hai3 小时前
Linux网络编程03-HTTP协议
linux·运维·服务器·网络·网络协议·http·linux网络编程