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

前言:

学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第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.hqwc.cn/news/485673.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

igolang学习2,golang开发配置国内镜像

go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct

轻松掌握opencv的8种图像变换

文章目录 opencv的8种图像变换1. 图像放大、缩小2. 图像平移3. 图像旋转4. 图像仿射变换5. 图像裁剪6. 图像的位运算&#xff08;AND, OR, XOR&#xff09;7. 图像的分离和融合8. 图像的颜色空间 opencv的8种图像变换 1. 图像放大、缩小 我们先看下原图 import cv2 import ma…

Stable Diffusion 模型分享:A-Zovya RPG Artist Tools(RPG 大师工具箱)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 A-Zovya RPG Artist Tools 模型是一个针对 RPG 训练的一个模型&#xff0c;可以生成一些 R…

用友U8库存展望数据显示错误

1、库存展望显示有订单在途。 2、双击查看明细&#xff0c;显示某个采购订单显示有预计入库量。 3、查询该采购订单&#xff0c;发现已入库完成未退货&#xff0c;确定为数据异常。 修改采购订单表体的iReceivedQTY(累计到货数量)字段后&#xff0c;恢复正常。 UPDATE dbo.PO_…

这6款实用的AI写作软件你值得拥有

在当今信息爆炸的时代&#xff0c;人们对于高效、便捷的写作工具需求越来越迫切。AI写作软件应运而生&#xff0c;为广大写作者提供了更加智能、高效的写作方式。在国内&#xff0c;有许多优秀的AI写作软件&#xff0c;下面就为大家介绍6款实用的AI写作软件&#xff0c;让你的写…

ELK 简介安装

1、概念介绍 日志介绍 日志就是程序产生的&#xff0c;遵循一定格式&#xff08;通常包含时间戳&#xff09;的文本数据。 通常日志由服务器生成&#xff0c;输出到不同的文件中&#xff0c;一般会有系统日志、 应用日志、安全日志。这些日志分散地存储在不同的机器上。 日志…

Unity Meta XR SDK 快捷配置开发工具【Building Block/Quick Action/OVRCameraRigInteraction】

文章目录 &#x1f4d5;教程说明&#x1f4d5;Building Block&#x1f4d5;Quick Action&#x1f4d5;OVRCameraRigInteraction 此教程相关的详细教案&#xff0c;文档&#xff0c;思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量 XR 社区&#xff0c;博主目前在内…

如何设置路由器的端口映射?

路由器端口映射是一种常用的网络配置方式&#xff0c;可以将外部网络请求转发到内部网络上的指定设备。通过设置端口映射&#xff0c;我们可以实现远程访问局域网内的设备&#xff0c;使其在任何网络环境下都可以被访问。本文将介绍如何设置路由器的端口映射&#xff0c;以便实…

华为OD机试真题-查找接口成功率最优时间段-2023年OD统一考试(C卷)--Python3--开源

题目&#xff1a; 考察内容&#xff1a; for 时间窗口list(append, sum, sort) join 代码&#xff1a; """ 题目分析&#xff1a;最长时间段 且平均值小于等于minLost同时存在多个时间段&#xff0c;则输出多个&#xff0c;从大到小排序未找到返回 NULL 输入…

大型语言模型的语义搜索(一):关键词搜索

关键词搜索(Keyword Search)是文本搜索种一种常用的技术&#xff0c;很多知名的应用app比如Spotify、YouTube 或 Google map等都会使用关键词搜索的算法来实现用户的搜索任务&#xff0c;关键词搜索是构建搜索系统最常用的方法&#xff0c;最常用的搜索算法是Okapi BM25&#x…

TCP/IP协议详解

文章目录 TCP/IP协议概述基于TCP/IP协议的应用工具协议协议的必要性 TCP/IP协议TCP/IP协议族协议的分层 传输方式的分类报文、帧、数据包等的区别TCP 和 UDP的区别 TCP/IP协议概述 TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;是一组通信协…

使用 package.json 配置代理解决 React 项目中的跨域请求问题

使用 package.json 配置代理解决 React 项目中的跨域请求问题 当我们在开发前端应用时&#xff0c;经常会遇到跨域请求的问题。为了解决这个问题&#xff0c;我们可以通过配置代理来实现在开发环境中向后端服务器发送请求。 在 React 项目中&#xff0c;我们可以使用 package…

Cubemax创建FreeRTOS工程

目录 1.选择芯片型号&#xff0c;进入Pinout & Configuration 2.配置RCC的HSE为晶体/陶瓷振荡器 4.配置LED-GPIO引脚 5.配置调试串口UART1 6.配置FreeRTOS 7.配置时钟 8.工程管理配置 9.生成代码 1.选择芯片型号&#xff0c;进入Pinout & Configuration 2.配置…

【Python机器学习】详解Python机器学习进行时间序列预测

&#x1f517; 运行环境&#xff1a;Python &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

横空出世,Bright Data 低代码数据平台,即将颠覆你的认知!

大家好&#xff0c;我是锋哥&#xff0c;最近接了个监控平台的私活项目。由于监控公开的站点太多&#xff0c;在我无从下手迷茫之际&#xff0c;竟然无意中发现了这个宝藏级低代码数据平台 - 亮数据。功能强大&#xff0c;性能炸裂&#xff01; 传统开发 以前我们开发这种监控…

庖丁解牛-二叉树的遍历

庖丁解牛-二叉树的遍历 〇、前言 01 文章内容 一般提到二叉树的遍历&#xff0c;我们是在说 前序遍历、中序遍历、后序遍历和层序遍历 或者说三序遍历层序遍历&#xff0c;毕竟三序和层序的遍历逻辑相差比较大下面讨论三序遍历的递归方法、非递归方法和非递归迭代的统一方法然…

Python编程语言的特点和优点

Python编程语言的特点和优缺点 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; …

设计模式复习

设计模式 1、什么是设计模式 一个模式描述了一个在我们周围不断重复发生的问题以及该问题的解决方案的核心。这样&#xff0c;你就能一次又一次地使用该方案而不必做重复劳动.尽管Alexander所指的是城市和建筑模式&#xff0c;但他的思想也同样适用于于面向对象设计模式&…

【DDD】学习笔记-发布者—订阅者模式

在领域设计模型中引入了领域事件&#xff0c;并不意味着就采用了领域事件建模范式&#xff0c;此时的领域事件仅仅作为一种架构或设计模式而已&#xff0c;属于领域设计模型的设计要素。在领域设计建模阶段&#xff0c;如何选择和设计领域事件&#xff0c;存在不同的模式&#…

Jenkins 中部署Nodejs插件并使用,并构建前端项目(3)

遇到多个版本nodeJS需要构建的时候 1、第一种就是一个配置安装&#xff0c;然后进行选中配置 2、第二种就是插件&#xff1a;nvm-wrapper&#xff0c;我们还是选用NodeJS插件&#xff1a; &#xff08;1&#xff09;可以加载任意npmrc文件&#xff1b; &#xff08;2&#x…