中科大计网学习记录笔记(十三):UDP 套接字编程 | 传输层概述和传输层的服务

news2024/9/21 10:57:15

前言:

学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程
该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信息量过大,有太多无法理解的地方,在我第一次点开的时候也有相同的感受,但经过了一段时间项目的学习,对计网有了更多的了解,所以我准备在这次学习的时候做一些记录并且加入一些我的理解,希望能够帮助到大家。
往期笔记可以看专栏中的内容😊😊😊

文章目录

      • 2.9 UDP 套接字编程
    • 03. 传输层
      • 3.1 概述和传输层的服务
        • 3.1.1 传输服务和协议
        • 3.1.2 传输层 VS 网络层
        • 3.1.3 Internet 传输层协议

2.9 UDP 套接字编程

💡 与 TCP 不同的是 UDP 在客户端和服务器之间没有连接

  • 发送端在报文中要明确的制定目标的 IP 地址和端口号
  • 服务器必须从收到的分组中提取出发送端的 IP 地址和端口号。

再来看一下 UDP 套接字编程的代码,与上节的 TCP 编程做一下对比

👉 上节内容:中科大计网学习记录笔记(十二):TCP 套接字编程

因为很多具体的部分上节已经讲过了,这里直接上代码

🍀 服务端

	// 创建 UDP 套接字
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 创建 TCP 套接字
    if ((client_sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

可以看出创建 socket 时指定的套接字类型不同,分别为 SOCK_DGRAMSOCK_STREAM

// 设置服务器地址结构
    memset(&server_addr, 0, sizeof(server_addr));
    memset(&client_addr, 0, sizeof(client_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(PORT);

    // 将套接字绑定到服务器地址
    if (bind(sockfd, (const struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("Bind failed");
        exit(EXIT_FAILURE);
    }

接下来是设置服务器的 sockaddr 并且将其与 socket 相关联

while (1) {
    // 接收来自客户端的消息
    n = recvfrom(sockfd, (char *)buffer, BUF_SIZE, 0, (struct sockaddr *)&client_addr, &len);
    buffer[n] = '\0';
    printf("Client : %s\n", buffer);

    // 将接收到的消息发送回客户端
    sendto(sockfd, (const char *)buffer, strlen(buffer), 0, (const struct sockaddr *)&client_addr, len);
}

在这里可以发现,服务器并没有 创建新的 socket 而是直接从输入中获得了客户端的信息来直接返回数据。

🍀 客户端

sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
    perror("Socket creation failed");
    exit(EXIT_FAILURE);
}
// 设置服务器地址结构
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
// 发送信息到服务器
sendto(sockfd, (const char *)buffer, strlen(buffer), 0, (const struct sockaddr *)&server_addr, sizeof(server_addr));
// 接收服务器的响应
n = recvfrom(sockfd, (char *)buffer, BUF_SIZE, 0, NULL, &len);

💡 可以看出是直接发送的数据,而没有经过连接的过程

03. 传输层

提纲:

3.1 概述和传输层服务

3.2 多路复用与解复用

3.3 无连接传输:UDP

3.4 可靠数据传输的原理

3.5 面向连接的传输 TCP

  • 段结构
  • 可靠数据传输
  • 流量控制
  • 连接管理

3.6 拥塞控制原理

3.7 TCP 拥塞控制

3.1 概述和传输层的服务

3.1.1 传输服务和协议

💡 传输层为运行在 不同主机 上的 应用进程 提供了逻辑通信

  • 在前面的学习中可以得知,网络层提供了端到端的通信,而传输层在网络层的基础上又提供了进程到进程的通信。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 传输协议(如 TCP、UDP)运行在端系统上,发送方将应用层的报文分割成报文段(UDP 为数据报(datagram))

  • TCP 提供的是数据流的服务,而对于数据的分割需要应用层根据协议来判断

3.1.2 传输层 VS 网络层

💡 传输层提供进程之间的通信,网络层提供端到端的通信

在前面学到:本层对于上层的服务是本层的服务与其下面所有层提供的服务的总和

传输层作为网络层的上层在其端到端的通信的基础上做了如下的增强:

传输层对网络层做了几项主要的增强:

  1. 可靠性:传输层提供了可靠的数据传输机制。TCP(传输控制协议)通过序列号、确认和重传机制来确保数据的可靠性,即使在网络出现丢包或乱序的情况下也能够按序正确地传输数据。
  2. 流量控制:传输层通过流量控制机制来控制数据的传输速率,以防止发送方发送速度过快导致接收方无法及时处理数据而造成数据丢失。TCP利用滑动窗口机制进行流量控制。
  3. 拥塞控制:传输层还实现了拥塞控制机制,以避免网络拥塞并确保网络的高效利用。TCP通过拥塞窗口和拥塞避免算法来控制数据的发送速率,从而避免网络拥塞。
  4. 多路复用:传输层可以在单个网络连接上同时传输多个数据流,即多路复用。TCP和UDP都支持在同一个端口上通过不同的套接字进行多路复用。

在这些里面需要注意的是多路复用:多路复用就是提供传输多个数据流来为多个进程提供服务,分为两步

  • 在传输端需要做到 多路复用
  • 在接收端需要 解复用

来举一个现实中的例子:

💡 Ann 家里的 12 个孩子给 Bill 家里的 12 个孩子发邮件

  • Ann 家里将所有的邮件打包发出(复用)
  • Bill 家里来讲邮件分发给不同的孩子(解复用)

类比:

  • 主机 = 家庭
  • 进程 = 小孩
  • 应用层报文= 信封中的信件
  • 传输协议= Ann 和 Bill
    • 为家庭小孩提供复用解复用服 务
  • 网络层协议 = 邮政服务
    • 家庭-家庭的邮包传输服务
3.1.3 Internet 传输层协议

🍀 TCP 提供的服务:

  1. 可靠的数据传输:TCP通过序列号、确认和重传机制来确保数据的可靠传输,即使在网络出现丢包或乱序的情况下也能够按序正确地传输数据。
  2. 流量控制:TCP通过滑动窗口机制来进行流量控制,防止发送方发送速度过快导致接收方无法及时处理数据而造成数据丢失。
  3. 拥塞控制:TCP通过拥塞窗口和拥塞避免算法来控制数据的发送速率,避免网络拥塞并确保网络的高效利用。
  4. 面向连接:TCP是面向连接的协议,通信双方在通信前需要建立连接,数据传输完成后需要释放连接。这种连接方式提供了一种可靠的通信环境,可以确保数据传输的有序性和可靠性。
  5. 有序传输:TCP保证数据的有序传输,即发送方发送的数据包按顺序到达接收方,接收方能够按顺序正确地接收和处理数据。
  6. 多路复用和解复用

🍀 UDP 提供的服务

  1. 无连接:UDP是一种无连接的协议,通信双方在通信前不需要建立连接,直接进行数据传输。这使得UDP的通信过程更加简单和高效。
  2. 尽最大努力交付:UDP不保证数据的可靠传输,它尽最大努力将数据包从发送方传输到接收方,但不保证数据的正确性、顺序性和完整性。因此,在不稳定的网络环境下,UDP可能会出现丢包、乱序或重复传输等问题。
  3. 无流量控制:UDP不提供流量控制机制,发送方可以按照自己的速度发送数据,而不考虑接收方的接收能力。这意味着UDP可能会导致网络拥塞和数据丢失。
  4. 无拥塞控制:与流量控制类似,UDP也不提供拥塞控制机制,发送方发送数据时不会考虑网络的拥塞情况,可能会导致网络拥塞和数据丢失。
  5. 数据报格式:UDP使用数据报格式来传输数据,每个数据报都包含了完整的数据信息以及源和目标端口号等信息,这使得UDP适用于对实时性要求较高的应用场景,如音视频传输、在线游戏等。
  6. 多路复用和解复用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1464730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LangChain支持哔哩哔哩视频总结

是基于LangChain框架下的开发&#xff0c;所以最开始请先 pip install Langchain pip install bilibili-api-python 技术要点&#xff1a; 使用Langchain框架自带的Document loaders 修改BiliBiliLoader的源码&#xff0c;自带的并不支持当前b站的视频加载 源码文件修改&a…

Microsoft的PromptBench可以做啥?

目录 PromptBench简介 PromptBench的快速模型性能评估 PromptBench数据集介绍 PromptBench模型介绍 PromptBench模型加载遇到的问题 第一次在M1 Mac上加载模型 vicuna和llama系列模型 PromptBench各个模型加载情况总结 PromptBench的Prompt快速工程 chain of thought…

【Qt学习】QLineEdit 控件 属性与实例(登录界面,验证密码,正则表达式)

文章目录 1. 介绍2. 实例使用2.1 登录界面2.2 对比两次密码是否相同2.3 通过按钮显示当前输入的密码&#xff08;并对2.2进行优化&#xff09;2.4 结语 3. 正则表达式3.1 QRegExp3.2 验证输入内容 4. 资源代码 1. 介绍 关于 QLineEdit 的详细介绍&#xff0c;可以去查阅官方文…

【Spring】IoC容器 控制反转 与 DI依赖注入 三种实现方式 总结 第五期

目录 1 - 4 期三种配置方式总结1. XML方式配置总结2. XML注解方式配置总结3. 完全注解方式配置总结 整合Spring5-Test5搭建测试环境 1 - 4 期 介绍 IoC DI Xml实现 IoC DI 注解 Xml 实现 IoC DI 完全注解实现 三种配置方式总结 1. XML方式配置总结 所有内容写到xml格式…

Linux第63步_为新创建的虚拟机添加必要的目录和安装支持linux系统移植的软件

1、创建必要的目录 输入密码“123456”&#xff0c;登录虚拟机 这个“zgq”&#xff0c;是用户名&#xff0c;也是下面用到的的“zgq”目录。 1)、创建“/home/zgq/linux/”目录 打开终端&#xff0c;进入“/home/zgq/”目录 输入“mkdir linux回车”&#xff0c;创建“/ho…

VUE3使用three.js显示3D模型

使用3D模型作为自动化系统的界面已经成为潮流。尽管在AutomationML 中推荐COLLADA作为 3D 模型的标准。但是COLLADA的开发者khronos 集团却已经开发了COLLADA的后继者glTF 。glTF 2.0已经成为国际标准ISO/IEC 12113:2022。 Khronos声称-‘glTF是3D里的JPEG’。目前看来glTF 更加…

【Linux】 login命令使用

login命令 在 Linux 中用于创建一个新的会话&#xff0c;并在新会话中登录用户。这个命令通常在终端中自动执行&#xff0c;当你打开一个新的终端会话或者通过 SSH 远程连接到 Linux 服务器时。 在命令后面附加欲登入的用户名称&#xff0c;它会直接询问密码&#xff0c;等待…

软件压力测试:测试方法与步骤详解

随着软件应用的不断发展&#xff0c;用户对系统性能的要求也逐渐提高。在不同的负载条件下&#xff0c;系统必须能够保持稳定、高效的运行。软件压力测试是一种验证系统在各种负载情况下性能表现的关键手段。本文将详细探讨软件压力测试的方法和步骤。 1. 明确测试目标 在进行压…

canvas水波纹效果,jquery鼠标水波纹插件

canvas水波纹效果&#xff0c;jquery鼠标水波纹插件 效果展示 jQuery水波纹效果&#xff0c;canvas水波纹插件 HTML代码片段 <div class"scroll04wrap"><h3>发展历程</h3><div class"scroll04"><p>不要回头&#xff0c;一…

Sora背后的论文(1):使用 lstms 对视频展现进行无监督学习

之前那篇《Sora背后的32篇论文》发出后&#xff0c;大家都觉得不错&#xff0c;有很多小伙伴都开始啃论文了。 那么我就趁热打铁&#xff0c;把这32篇论文的通俗解读版贴一下。 从去年开始&#xff0c;我基本上形成了一个思维方式&#xff0c;任何事情做之前先看看 有没有好的…

C++力扣题目 647--回文子串 516--最长回文子序列

647. 回文子串 力扣题目链接(opens new window) 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 示例 1&#xff1a; 输入&#xff1a…

C++ 文件操作-文本文件-读取和打开文件方法详解

读文件步骤 #include <iostream> using namespace std; #include <fstream> #include <string> //文本文件 读文件void test(){// 1 包含头文件// 2 创建流对象ifstream ifs;// 3 打开文件 并且判断是否打开成功ifs.open("table.txt",ios::in); //…

力扣随笔之两数之和 Ⅱ -输入有序数组(中等167)

思路&#xff1a;在递增数组中找出满足相加之和等于目标数 定义左右两个指针&#xff08;下标&#xff09;从数组两边开始遍历&#xff0c;若左右指针所指数字之和大于目标数&#xff0c;则将右指针自减&#xff0c;若左右指针所指数字之和小于目标数&#xff0c;则左指针自加&…

C# CAD2016 cass10宗地Xdata数据写入

一、 查看cass10写入信息 C# Cad2016二次开发获取XData信息&#xff08;二&#xff09; 一共有81条数据 XData value: QHDM XData value: 121321 XData value: SOUTH XData value: 300000 XData value: 141121JC10720 XData value: 权利人 XData value: 0702 XData value: YB…

VSCode-更改系统默认路径

修改vscode中的默认扩展路径&#xff1a;"%USERPROFILE%\.vscode" 打开目录C:\用户\电脑用户名&#xff0c;将.vscode文件剪切至D:\VSCode文件夹下 用管理员身份打开cmd.exe命令界面输入mklink /D "%USERPROFILE%\.vscode" "D:\VSCode\.vscode\"…

AI工具新革命:从ChatGPT到Sora,生成式AI改变世界

这个春节着实精彩&#xff0c;“春山学”吃透了&#xff0c;不如把目光移向OpenAI又一重磅产品——文生视频大模型Sora。智能新纪元已然开启&#xff0c;因为正如周鸿祎所说&#xff1a;“,Sora的诞生意味着AGI&#xff08;通用人工智能&#xff09;的实现将从10年缩短到1年。”…

【高德地图】Android高德地图初始化定位并显示小蓝点

&#x1f4d6;第3章 初始化定位并显示小蓝点 ✅第1步&#xff1a;配置AndroidManifest.xml✅第2步&#xff1a;设置定位蓝点✅第3步&#xff1a;初始化定位✅完整代码 ✅第1步&#xff1a;配置AndroidManifest.xml 在application标签下声明Service组件 <service android:n…

阿里开源低代码引擎 - Low-Code Engine

阿里开源低代码引擎 - Low-Code Engine 本文主要介绍如何在Windows运行/开发阿里开源低代码引擎 - Low-Code Engine 详细文档参见【 阿里开源低代码引擎 - Low-Code Engine 官方文档】 目录 阿里开源低代码引擎 - Low-Code Engine一、环境准备1、使用 WSL 在 Windows 上安装 L…

【Kotlin】流程控制

1 选择结构 Kotlin 中选择结构主要包含 if -else、when 语句&#xff0c;并且可以返回结果。 1.1 if-else 1.1. 条件选择 fun main() {var score 85if (score > 90) {println("优秀")} else if (score > 80) {println("良好")} else if (score &…

基于SSH打通隧道实现异地组网

前言 最近有异地组网的需求&#xff0c;我目前的是用蒲公英X1盒子来进行组网&#xff0c;但是蒲公英X1非会员账号有设备限制3个&#xff08;这个是硬伤&#xff09;&#xff0c;虽然说可以打通P2P但是在复杂的网络环境下概率不是特别高 所以研究下SSH异地组网的方式&#xff…