网络编程TCP/UDP

1 网络通信概述

1.1 IP 和端口

        所有的数据传输,都有三个要素 :源、目的、长度
        怎么表示源或者目的呢?请看图

所以,在网络传输中需要使用“IP 和端口”来表示源或目的。

1.2 网络传输中的 2 个对象:server client

        我们经常访问网站,这涉及 2 个对象:网站服务器浏览器。网站服务器平时安静地呆着,浏览器主动发起数据请求。网站服务器浏览器可以抽象成 2 个软件的概念:server 程序、client 程序。

1.3 两种传输方式:TCP/UDP

在一般的网络书籍中,网络协议被分为 5 层,如图
应用层:它是体系结构中的最高层,直接为用户的应用进程(例如电子邮件、 文件传输和终端仿真)提供服务。在因特网中的应用层协议很多,如支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议,支持文件传送的 FTP 协议, DNS ,POP3, SNMP Telnet 等等。
运输层:负责向两个主机中进程之间的通信提供服务。
运输层主要使用以下两种协议:

1. 传输控制协议 TCP(Transmission Control Protocol):面向连接的,数据传输的单位是报文段,能够提供可靠的交付。

2. 用户数据包协议 UDP(User Datagram Protocol):无连接的,数据传输的单位是用户数据报,不保证提供可靠的交付,只能提供“尽最大努力交付

网络层:负责将被称为数据包(datagram )的网络层分组从一台主机移动到另一台主机。
链路层:因特网的网络层通过源和目的地之间的一系列路由器路由数据报。

物理层:在物理层上所传数据的单位是比特。物理层的任务就是透明地传送比特流。

        这些层对于初学者来说很难理解,我们只需要知道:我们需要使用“运输层”编写应用程序,我们的应用程序位于“应用层”。
        使用“运输层”时,可以选择 TCP 协议,也可以选择 UDP 协议。

 1.3.1 原理上的区别

        TCP 向它的应用程序提供了面向连接的服务。这种服务有 2 个特点:可靠传输、流量控制(即发送方/ 接收方速率匹配)。它包括了应用层报文划分为短报文,并提供拥塞控制机制。
        UDP 协议向它的应用程序提供无连接服务。它没有可靠性,没有流量控制,也没有拥塞控制。

1.3.2 为何存在 UDP 协议       

        既然 TCP 提供了可靠数据传输服务,而 UDP 不能提供,那么 TCP 是否总是首选呢?      
        答案是否定的,因为有许多应用更适合用 UDP ,举个例子:视频通话时,使用 UDP ,偶尔的丢包、偶尔的花屏时可以忍受的;如果使用 TCP ,每个数据包都要确保可靠传输,当它出错时就重传,这会导致后续的数据包被阻滞,视频效果反而不好。

        使用 UDP 时,有如下特点:

1.关于何时发送什么数据控制的更为精细

        采用 UDP 时只要应用进程将数据传递给 UDPUDP 就会立即将其传递给网络层。而 TCP 有重传机制,而不管可靠交付需要多长时间。但是实时应用通常不希望过分的延迟报文段的传送,且能容忍一部分数据丢失。

2.无需建立连接,不会引入建立连接时的延迟。

3.无连接状态,能支持更多的活跃客户。

4.分组首部开销较小。

1.3.3 TCP/UDP 网络通信大概交互图     

        下面我们分别画出运用 TCP 协议和运用 UDP 协议的客户端和服务器大概交互图。
面向连接的 TCP 流模式:

UDP 用户数据包模式:

2 网络编程主要函数介绍

2.1 socket 函数

int socket(int domain, int type,int protocol);
此函数用于创建一个套接字。
  • domain 是网络程序所在的主机采用的通讯协族(AF_UNIX AF_INET )
        ◼ AF_UNIX 只能够用于单一的 Unix 系统进程间通信,而 AF_INET 是针对 Internet 的,因而可以允许远程通信使用。
  • type 是网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM )
        ◼ SOCK_STREAM 表明用的是 TCP 协议,这样会提供按顺序的,可靠,双向,面向连接的比特流。
        ◼ SOCK_DGRAM 表明用的是 UDP 协议,这样只会提不可靠,无连接的通信。
  • 关于 protocol,由于指定了 type,所以这个地方一般只要用 0 来代替就可以了。
        此函数执行成功时返回文件描述符,失败时返回-1, errno 可知道出错的详细情况。

2.2 bind 函数

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
从函数用于将地址绑定到一个套接字。
sockfd 是由 socket 函数调用返回的文件描述符。
my_addr 是一个指向 sockaddr 的指针。
addrlen sockaddr 结构的长度。
sockaddr 的定义:
struct sockaddr{
    unisgned short as_family;
    char sa_data[14];
};
        不 过 由 于 系 统 的 兼 容 性 , 我 们 一 般 使 用 另 外 一 个 结 构 (struct sockaddr_in) 来代替。
sockaddr_in 的定义:
struct sockaddr_in{
    unsigned short sin_family;
    unsigned short sin_port;
    struct in_addr sin_addr;
    unsigned char sin_zero[8];
}
如果使用 Internet 所以 sin_family 一般为 AF_INET
sin_addr 设置为 INADDR_ANY 表示可以和任何的主机通信。
sin_port 是要监听的端口号。
bind 将本地的端口同 socket 返回的文件描述符捆绑在一起 . 成功是返回 0, 失败的情况和 socket 一样。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机的汽车安全气囊系统故障仿真设计

**单片机设计介绍, 基于单片机微波炉加热箱系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的汽车安全气囊系统的故障检测系统是一种用于检测安全气囊系统故障的智能化设备,通过单片机控…

WPF小知识

在编写WPF程序遇到一些小问题&#xff0c;所以记录起来&#xff0c;查其他方便。 Label自动换行 网上搜的都不能自动换行&#xff0c;发现使用Run 就可以。在脚本中直接调用labTip.Text进行赋值就可以了。 <Label Foreground"#FF9E9E9E" FontSize"16"…

[Android]创建TabBar

创建一个包含“首页”、“分类”和“我的”选项卡的TabBar并实现切换功能&#xff0c;通常可以通过使用TabLayout结合ViewPager或ViewPager2来完成。以下是一个基本的示例&#xff0c;展示了如何使用Kotlin和XML来实现这个功能。 1.添加依赖项到build.gradle dependencies {/…

pg_bouncer在使用中的坑勿踩

目录 简介 环境信息 问题配置 问题配置 启动pgbouncer 链接逻辑图 测试存在问题 pgadmin4 Idea JAVA调用 ​编辑 dbeaver 建议&#xff1a; 简介 前面文章说过关于pg_bouncer的安装讲解&#xff0c;这里讲一下在使用中的坑&#xff0c;在进行配置的时候需要注意。 …

Linux设备树(DTS)介绍

Dts&#xff1a;DTS即Device Tree Source&#xff0c;是一个文本形式的文件&#xff0c;用于描述硬件信息。一般都是固定信息&#xff0c;无法变更&#xff0c;无法overlay。 设备树由来 linux内核源码中&#xff0c;之前充斥着大量的平台相关&#xff08;platform Device&…

《算法通关村——位运算常用技巧》

《算法通关村——位运算常用技巧》 位运算的性质有很多&#xff0c;此处列举一些常见性质&#xff0c;假设以下出现的变量都是有符号整数。 ●幂等律&#xff1a;a &aa&#xff0c;a ∣ aa&#xff08;注意异或不满足幂等律&#xff09;&#xff1b; ●交换律&#xff1…

基于Python实现连锁咖啡店经营情况EDA分析【500010097】

导入模块 import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots import plotly.express as px获取数据 df pd.read_csv(r./data/coffeeshop.csv) data_exploration(df)数据缺失值情况 print(数据缺失值情况&#xff1a;) df.…

【halcon】外观检测总结之灰度操作

1 灰度操作之 滞后延时 *滞后阈值 hysteresis_threshold (ImageInvert, RegionHysteresis, 190, 220, 3)这句话的意思就是&#xff0c;逐个判断这个图片区域里像素的灰度值&#xff0c;如果这个值小于190就不考虑了pass掉&#xff0c;如果大于220就直接入选。值在190和220之间…

大型语言模型与知识图谱融合方法概述

背景意义 大型语言模型&#xff08;LLM&#xff09;已经很强了&#xff0c;但还可以更强。通过结合知识图谱&#xff0c;LLM 有望解决缺乏事实知识、幻觉和可解释性等诸多问题&#xff1b;而反过来 LLM 也能助益知识图谱&#xff0c;让其具备强大的文本和语言理解能力。而如果…

JS-项目实战-鼠标悬浮变手势(鼠标放单价上生效)

1、鼠标悬浮和离开事件.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格…

500报错解决了

问题&#xff1a; 如图所示&#xff0c;控制台报错找不到com.itheima.service.EmpService.page这个函数 刚开始一直以为是SQL语句写错了或者是哪里代码写漏了&#xff0c;检查了很多遍&#xff0c;还把源代码拷过来&#xff0c;执行也不对&#xff0c;于是就直接打开源项目执行…

使用OKhttp3 与青云客AI聊天机器人交互 -Java

1.青云客 官网&#xff1a;http://api.qingyunke.com/ 2.添加依赖 <!--okhttp3 依赖--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.3</version></dependency&g…

sqli-labs(Less-5) updatexml闯关

updatexml() - Xpath类型函数 1. 确定注入点闭合方式 确认为字符型注入 2. 爆出当前数据库的库名 http://127.0.0.1/sqlilabs/Less-5/?id1 and updatexml(~,concat(~,(select database())),~) --3. 爆出当前用户名 http://127.0.0.1/sqlilabs/Less-5/?id1 and updatexml…

Unity中Shader矩阵的逆矩阵

文章目录 前言一、逆矩阵的表示二、逆矩阵的作用四、逆矩阵的计算五、顺序的重要性六、矩阵的逆总结1、求矩阵的逆前&#xff0c;这个矩阵必须得是个方阵2、只有 A x A ^-1^ A^-1^ x A 1时&#xff0c;A的逆才是A^-1^3、求2x2矩阵的逆&#xff1a;交换 a 和 b 的位置&#xf…

大厂必备的6款React UI框架

优秀的ReactUI框架可以为您节省开发时间&#xff0c;提高开发效率&#xff0c;统一设计语言。你还在为你的项目寻找高质量的ReactUI框架吗&#xff1f;为了让您更容易找到易于使用的UI框架&#xff0c;分享6个优秀的ReactUI框架选项&#xff0c;并介绍了每个UI框架的不同功能和…

91.移动零(力扣)

问题描述 代码解决以及思想 class Solution { public:void moveZeroes(vector<int>& nums) {int left 0; // 左指针&#xff0c;用于指向当前非零元素应该放置的位置int right 0; // 右指针&#xff0c;用于遍历数组int len nums.size(); // 数组长度while …

SSH远程登录协议

目录 什么是ssh服务器 概念 优点 原理 SSH登录 方法一 无需验证 方法二 格式&#xff1a; ssh -l 用户名 IP 地址 -p port -l &#xff1a;指定登录名称 -p&#xff1a;选项&#xff0c;指定登录端口&#xff08;当服务端的端口非默认时&#xff0c;需要使用-p…

mindspore mindyolo目标检测华为昇腾上推理使用、训练;华为OBS文件传输使用

参考&#xff1a; https://github.com/mindspore-lab/mindyolo 使用案例&#xff1a; https://github.com/mindspore-lab/mindyolo/blob/master/GETTING_STARTED.md 安装&#xff1a; pip install mindyolo特别注意opencv-python、opencv-python-headless版本问题&#xff0…

【UI测试】内容及流程

UI测试&#xff08;User Interface Testing&#xff09;是指对于界面设计的测试&#xff0c;目的是验证应用程序在用户界面方面的正确性、易用性和稳定性。 下面是UI测试的内容和流程&#xff1a; 一、UI测试的内容 1、布局测试 页面布局&#xff1a;测试页面上元素排列是否…

php实现选择排序法

选择排序法是一种简单的排序算法&#xff0c;其基本思想是每次从未排序的部分中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;然后放到已排序部分的末尾。 以下是用PHP实现选择排序法的代码示例&#xff1a; <?php function selectionSort($arr) {$n count…