【网络通信基础与实践番外一】多图预警之图解UDP和TCP前置知识

server/2024/9/23 6:02:33/

参考大佬的文章https://www.cnblogs.com/cxuanBlog/p/14059379.html

一、宏观架构中的传输层

在计算机中,任何一个可以交换信息的介质都可以称为端系统。计算机网络的运输层则负责把报文从一端运输到另一端,运输层实现了让两个互不相关的主机进行了逻辑通信的功能,看起来像是让两个主机相连一样。

 数据包的结构如上图所示,数据包经过每层后,该层协议都会在数据包附上包首部,而当数据包经过传输层之后,会为其附上TCP首部,首部包含着源端口号和目的端口号。在发送端运输层将从发送应用程序接收到的报文转化为运输层分组,分组也被称为报文段(segment)。运输层一般会将报文段进行分割,分成较小的块,为每一块加上运输层首部并将其向目的地发送。

在运输层发送的过程中,可以选择的运输层协议主要有TCP和UDP。

二、谈谈一些基础概念

1、TCP和UDP

2、套接字

(1)socket的概念

socket实际上与TCP/IP没有必然联系,socket的出现只是方便了TCP/IP的使用 。可以直接使用下面Socket API的这些方法

(2)socket API方法

create():创建一个socket

bind():socket的标识,一般用于绑定端口号

listen():准备接收连接

connect():准备充当发送者

accept():准备充当接收者

write():发送数据

read():接收数据

close():关闭连接

(3)套接字处理过程

1是指调用create方法创建通信链路中的端点,创建完成后会返回描述该套接字的套接字描述符

2是指调用bind方法应用程序通过套接字描述符将唯一的名称绑定在套接字上,服务器必须绑定一个名称才能在网络中访问

3是指调用listen方法表示客户端愿意等待连接的意愿

4是指客户端应用程序调用connect方法发起与服务器的连接请求

5是指服务器应用程序使用accept API接受客户端连接请求

6是指在流套接字之间建立连接后,客户端和服务器之间就可以发起read/write API调用了

7是指当服务器或者客户端要停止操作时,调用close API释放套接字获取的所有系统资源

但是注意socket API不属于通信模型,socket API允许应用程序与传输层和网络层进行交互

为了方便资源的使用,提高机器的性能、利用率和稳定性等原因,我们的计算机都有一层软件叫做操作系统,它用于帮助我们管理计算机可以使用的资源,当我们的计算机要使用一个资源的时候,可以向操作系统申请,再由操作系统为我们分配和管理资源。通常我们要访问一个内核设别或者文件时,程序可以调用系统函数,系统就会为我们打开设备或者文件,然后返回一个文件描述符fd(或者称为ID,是一个整数),我们要访问该设备或者文件,只能通过你该文件描述符。

同理当我们使用网络时,要使用到对应的操作系统的操作和网络设备,所以我们可以向操作系统申请,然后系统会为我们创建一个套接字socket,并返回这个socket的ID,以后我们的程序要使用网络资源,只要向这个socket的编号ID操作即可、而我们每个网络进程至少对应着一个socket,向socket中的ID写数据,相当于是向网络发送数据,向socket中读数据,相当于是接收数据。

(4)端口

端口号是16位的非负整数,范围是0~65535之间,分为三种,

第一种是周知/标准端口号,范围是0~1023;

第二种是注册端口号,范围是1024~49151;

私有端口号,范围是49152~65535;

当一个报文到达服务器时,通过端口号来区分不同的应用程序,但是仅仅依靠端口号来确定某一条报文是不够的。互联网上一般使用源IP地址、目标IP地址、源端口号、目标端口号来进行区分。若果其中的某一项不同,就认为是不同的报文段。

而确认端口号的方法有两种,

第一种是标准既定的端口号,例如SSH使用22标识,FTP采用21标识,HTTP采用80标识;

第二种是时序分配的端口号,凭借操作系统为每个应用程序分配互不冲突的端口号;

(5)多路复用和多路分解

多路复用就是指从多个socket接收数据,为每块数据封装上头部信息,生成报文段,交给网络

多路分解就是指依据头部信息将收到的报文段交给对应的socket,即不同的进程

如上图所示,多路复用体现在从主机1和主机3的不同的socket接收数据,并为每块数据封装上头部信息生成报文段。

多路分解体现在将接收到的不同的报文段交给对应的socket,即不同的进程。 

(i)无连接的多路复用和多路分解

主要用于UDP协议,UDP套接字是一个二元组,这个二元组包含目的IP和目的端口,主机在收到UDP段后检查段中的目的端口号,将UDP段导向绑定在该端口号的socket。

(ii)面向连接的的多路复用和多路分解

TCP的socket用四元组来标识:源IP、源目端口号、目标IP、目标端口号

接收端利用所有的四个值将报文导向合适的socket,服务器可能支持多个TCP socket,每个socket用自己的四元组唯一标识

如上图所示,主机C向主机B发起了两个HTTP请求(具有着不同的源端口号),主机A向主机B发起了一个HTTP请求,主机A、B、C都有自己唯一的IP地址,当主机C发出这两个HTTP请求后,正因为这两个HTTP请求具有着不同的源端口号所以主机B能够分解这两个HTTP连接。而对于主机A和主机C来说,这两个主机有着不同的IP地址,所以对于主机B来说也能够进行分解。


http://www.ppmy.cn/server/120664.html

相关文章

数据结构字节对齐

求 sizeof(name1)?(晟安信息) struct name1{ char str; short x; int num; }; 8 分析:char 1字节,short 2字节,int 4字节;所以以4字节为一个步长,需要2步长,所以sizeof(name1)为8。 (电工时代) …

C++学习笔记(36)

300、Linux 的 Hello world 一、快速入门 Linux 用两天的时间学习《程序员两天快速入门 Linux》。 二、安装软件包 1)安装 C 和 C的编译器 yum -y install gcc* 2)升级编译器 升级软件包: yum -y install centos-release-scl devtoolset-8-gc…

基于YOLOv5的教室人数检测统计系统

基于YOLOv5的教室人数检测统计系统可以有效地用于监控教室内的学生数量,适用于多种应用场景,比如 自动考勤、安全监控或空间利用分析 以下是如何构建这样一个系统的概述,包括环境准备、数据集创建、模型训练以及如何处理不同类型的媒体输入…

C语言 | Leetcode C语言题解之第424题替换后的最长重复字符

题目&#xff1a; 题解&#xff1a; int characterReplacement(char* s, int k) {int num[26];memset(num, 0, sizeof(num));int n strlen(s);int maxn 0;int left 0, right 0;while (right < n) {num[s[right] - A];maxn fmax(maxn, num[s[right] - A]);if (right - …

五、CAN总线

目录 一、基础知识 1、can介绍 2、CAN硬件电路 3、CAN电平标准 4、CAN收发器芯片介绍 5、CAN帧格式 ① CAN帧种类 ② CAN数据帧 ③ CAN遥控帧​编辑 ④ 位填充 ⑤ 波形实例 6、接收方数据采样 ① 接收方数据采样遇到的问题 ② 位时序 ③ 硬同步 ④ 再同步 ⑤ 波…

换个手机IP地址是不是不一样?

在当今这个信息爆炸的时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。而IP地址&#xff0c;作为手机连接网络的桥梁&#xff0c;也时常引起我们的关注。你是否曾经好奇&#xff0c;换个手机&#xff0c;IP地址会不会也跟着变呢&#xff1f;本文将深入探讨这个问题&a…

Neo4j 简单使用

在 Neo4j 项目中&#xff0c;搭建和使用主要包括以下几个步骤&#xff1a; 1. 安装 Neo4j 首先&#xff0c;安装 Neo4j 可以选择多种方式&#xff0c;包括&#xff1a; 本地安装&#xff1a;在 Windows、macOS 或 Linux 系统中&#xff0c;通过官网下载对应的 Neo4j 安装包。…

【论文阅读】Benchmarking Retrieval-Augmented Generation for Medicine

论文&#xff1a;https://arxiv.org/abs/2402.13178 代码&#xff1a; GitHub - Teddy-XiongGZ/MIRAGE: Official repository of the MIRAGE benchmark GitHub - Teddy-XiongGZ/MedRAG: Code for the MedRAG toolkit 研究背景&#xff1a; 系统地评估医用rag QA系统&#xff0…