网络传输层——UDP与TCP

前言:

1.国际网络体系结构:


    OSI模型: open system interconnect           理论模型
    1977   国际标准化组织
    各种不同体系结构的计算机能在世界范围内互联成网。
    
    应用层:要传输的数据信息,如文件传输,电子邮件等
    表示层:数据加密,解密操作,压缩,解压缩
    会话层:建立数据传输通道
    传输层:传输的方式  UDP  TCP   端口号
    网络层:实现数据路由    路由器  ip
    数据链路层:封装成帧,点对点通信(局域网内通信),差错检测   交换机 ARP
    物理层:定义物理设备标准,比如网线,光纤等传输介质   比特流  bit  0 1
    
    协议簇
    TCP/IP模型:  工业模型
    4层
    应用层:HTTP、HTTPS、FTP、TFTP、MQTT
    传输层:TCP、UDP
    网络层:IP
    网络接口层:网络接口层既是传输数据的物理媒介,也可以为网络层提供一条准确无误的线路
    
    5层
    应用层:HTTP、HTTPS、FTP、TFTP、MQTT
    传输层:TCP、UDP
    网络层:IP
    数据链路层:封装成帧,点对点通信(局域网内通信),差错检测   交换机
    物理层:定义物理设备标准,比如网线,光纤等传输介质   比特流  bit


2.协议:


    应用层协议:
        FTP:文件传输协议(实现文件上传/下载)
        TFTP:简单文件传输协议(实现文件上传/下载)
        HTTP:超文本传输协议(实现超文本(集视频、图片、文字于一体的文件类型)传输)
        HTTPS:加密版超文本传输协议
        MQTT:消息队列遥测传输协议(物联网传输)
        
    
    传输层协议:
        UDP:用户数据报协议
        TCP:传输控制协议

    网络层:
        IP协议
        192.168.1.128
        IPv4    32位
        IPv6    128位
        
        192.168.1.3         (用户表示形式)   点分十进制   
        11000000101010000000000100000011    (计算机存储形式) 32bits
        
        IP地址 = 网络位 + 主机位 
        
        192.168.0.121/24
        24:网络位的位数
        
        网络位:该IP地址位于哪个网段(局域网)内
        主机位:这个网段(局域网)第几台主机

        子网掩码:
            如:255.255.255.0
            11111111.11111111.11111111.00000000
            用来区分IP地址的网络位和主机位,搭配IP地址使用。
            子网掩码是1的部分对应IP地址的网络位
            子网掩码是0的部分对应IP地址的主机位

        192.168.1.0
        网段号:
            IP地址网络位不变,主机位全为0,则为该IP地址的网段号
            192.168.1.3
            255.255.0.0
            192.168.0.0
            位于
            192.168.1.0 网段内(网段内的IP能直接通信)
            
        广播号:
            IP地址网络位不变,主机位全为1,则为该IP地址的广播号
            192.168.1.3
            255.255.255.0
            广播号:
            192.168.1.255(向广播号发送信息,所有局域网内IP都能收到此信息)
            
            feiQ VNC
            192.168.1.255


        
    IP地址的划分:


        (1)A类地址:
                范围:1.0.0.0 - 126.255.255.255
                子网掩码:255.0.0.0          126*2^24        
                用于管理大规模网络
                
                私有IP地址:10.0.0.0 - 10.255.255.255
            
                127.0.0.0   回环地址
        (2)B类地址:
                范围:128.0.0.0 - 191.255.255.255
                子网掩码:255.255.0.0         2^16
                管理大中规模网络
                
                私有IP地址:172.16.0.0 - 172.31.255.255
            
        (3)C类地址:
                范围:192.0.0.0 - 223.255.255.255
                子网掩码:255.255.255.0        2^8
                管理中小规模网络
                
                私有IP地址:192.168.0.0 - 192.168.255.255
                
        (4)D类地址:
                224.0.0.0 - 239.255.255.255
                组播和广播使用
                
        (5)E类地址:
                240.0.0.0 - 255.255.255.254
                用来进行实验

        公有IP:由电信公司直接分配,并需要付费的IP地址, 可以直接访问internet
        私有IP:不能直接访问internet的ip地址
                
        节省ip地址


端口号: 16位的数值 0-65535
    作用:唯一的标识一个进程
    每一个应用进程都有一个端口号;
    通讯时用来区分数据包属于哪一个进程。
    
    分类:
        1)任何TCP/IP实现所提供的服务都用1-1023之间的端口号。
            http : 80
            FTP: 20/21
            TFPT: 69
            HTTPS: 443
        2)端口号从1024-49151是被注册的端口号,被IANA指定为特殊服务使用。
        
        3)从49152-65535是动态或私有端口号。


IP+PORT : 可以找到目标主机上的目标进程

3.TCP/IP封包,拆包过程
    网络协议栈


 
网络编程之 UDP
 


UDP:用户数据报协议
User Datagram Protocol

1、特性:         
                1.发送数据时不需要建立链接,节省资源开销
                2.不安全不可靠的协议        //一般用在实时性比较高的广播,组播//vnc
                3.面向报文。
                4.资源开销小

                
2、框架:

    C/S模式  :有一个专用的客户端  client----server
    QQ1--->腾讯服务器---->QQ2

   server:socket() ===>bind()===>recvfrom()===>close()
   client:socket() ===>(bind())===>sendto() ===>close()
 
    B/S模式    :有一个通用的客户端浏览器
    browser----server
    
套接字编程接口:
    

    1.socket 


      套接字:通信对象的抽象, 网络通信的端口,一个通信链的句柄。
      
      int socket(int domain, int type, int protocol);
      功能:
        创建一个用来通信的接口(文件描述符)
      参数:
        domain:通信的协议族(AF_INET:IPv4协议族)
        type:
            SOCK_DGRAM:数据报套接字    (UDP使用此类型)
            SOCK_STREAM:流式套接字    (TCP使用此类型)
            SOCK_RAW:原始套接字
        protocol:
            默认传0 按照协议的默认属性创建
      返回值:
        成功返回用来进行通信的文件描述符
        失败返回-1 
        
    IPv4地址形式:
        struct sockaddr_in {
           sa_family_t    sin_family; /* address family: AF_INET */
           in_port_t      sin_port;   /* port in network byte order */
           struct in_addr sin_addr;   /* internet address */
       };

       /* Internet address. */
       struct in_addr {
           uint32_t       s_addr;     /* address in network byte order */
       };


        
    2.sendto 


      ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
      功能:
        向一个IP地址和端口发送数据信息
        端口号:区分一台主机不同的应用程序(0 - 65535)
      参数:
        sockfd:套接字文件描述符
        buf:发送数据空间首地址
        len:发送数据的长度
        flags:发送数据属性(默认为0)
        dest_addr:目的IP地址和端口
        addrlen:目的IP地址和端口的长度
      返回值:
        成功返回实际发送字节数
        失败返回-1 

    
        struct sockaddr             通用地址类型
        struct sockaddr_in             IPv4地址类型
        struct sockaddr_in {
           sa_family_t    sin_family; /* address family: AF_INET */
           in_port_t      sin_port;   /* port in network byte order */
           struct in_addr sin_addr;   /* internet address */
        };
        struct in_addr {
           uint32_t       s_addr;     /* address in network byte order */
        };


    3.htons----》主机转网络字节序


        
        主机:小端   host
        网络:大端   network
    
      uint32_t htonl(uint32_t hostlong);          主机转网络
      uint16_t htons(uint16_t hostshort);         主机转网络
      uint32_t ntohl(uint32_t netlong);           网络转主机
      uint16_t ntohs(uint16_t netshort);          网络转主机

      h:host
      n:net 
      l:long 
      s:short 

    4.inet_addr


      in_addr_t inet_addr(const char *cp);
      功能:
        将字符串IP地址转换成二进制IP地址形式

      char *inet_ntoa(struct in_addr in);
      功能:
        将二进制ip转换成字符串

    练习:
        循环从终端接收字符串,并发送给串口调试助手,


    5.bind


      int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);
      功能:将一个套接字与IP地址和端口号绑定(只能绑定自己的IP地址)
      参数:
            sockfd:套接字文件描述符 
            addr:IP地址和端口号结构体首地址
            addrlen:长度
      返回值:
            成功返回0
            失败返回-1 


    6.recvfrom


      ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
      功能:
        接收网络发送的数据信息
      参数:
        sockfd:套接字文件描述符
        buf:存放数据空间首地址
        len:最大能够接收的数据个数
        flags:属性默认为0
        src_addr:存放发送端IP地址信息的空间首地址
        addrlen:想要接收的数据长度的空间首地址
      返回值:
        成功返回实际接收字节数
        失败返回-1 

      具有阻塞功能(直到接收到数据,才会继续向下执行)

使用UDP进行通信,一人一句 

 使用udp通信,传输视频以及图像。

UDP:用户数据报协议  传输层


特点:
    1.无连接
    2.不安全、不可靠
    3.面向报文
    4.占用资源开销小


    

tcp网络通信:


TCP : 传输控制协议   传输层

1. TCP特点:
    1.面向连接
    2.安全、可靠
    3.面向字节流
    4.占用资源开销大

    三次握手:
        指建立tcp连接时,需要客户端和服务端总共发送三次报文确认连接。
    四次挥手:
        断开一个tcp连接,需要客户端和服务端发送四个报文以确认断开。


2. 编程模型

   client: socket--->connect--->send/write--->close
   server:    socket--->bind--->listen--->accept---> recv/read--->close


    
函数接口:


    1.socket


      socket(AF_INET, SOCK_STREAM, 0);


    
    2.connect


      int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
      功能:
        发送三次握手链接请求
      参数:
        sockfd:套接字文件描述符
        addr:存放目的地址空间首地址
        addrlen:目的地址长度
      返回值:
        成功返回0 
        失败返回-1 


        
    3.send


      ssize_t send(int sockfd, const void *buf, size_t len, int flags);
      功能:
        发送数据
      参数:
        sockfd:套接字文件描述符
        buf:存放数据空间首地址
        len:数据长度
        flag:属性默认为0 
      返回值:
        成功返回发送字节数
        失败返回-1 


        
    4.recv


      ssize_t recv(int sockfd, void *buf, size_t len, int flags);
      功能:
        接收数据 
      参数:
        sockfd:套接字文件描述符
        buf:存放数据空间首地址 
        len:最多接收数据长度 
        flags:接收属性默认为0 
      返回值:
        成功返回实际接收字节数
        失败返回-1 
        连接断开返回0 

    5.bind


      int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);

    6.listen


      int listen(int sockfd, int backlog);
      功能:
        监听三次握手链接请求
      参数:
        sockfd:套接字文件描述符
        backlog:最多允许等待尚未处理的三次握手链接个数
      返回值:
        成功返回0 
        失败返回-1 

    7.accept


       int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
       功能:
          处理三次握手等待队列中的第一个请求并建立一个用来通信的新套接字
       参数:
          sockfd:套接字文件描述符
          addr:存放发送端IP地址空间首地址 
          addrlen:想要接收的IP地址的长度 
       返回值:
          成功返回新文件描述符
          失败返回-1 


TCP粘包问题


    
    TCP协议是面向字节流的协议,接收方不知道消息的界限,不知道一次提取多少数据,这就造成了粘包问题。

    粘包问题出现的原因: 

     1. 发送端:需要等缓冲区满时才发送出去,造成粘包;

     2. 接收端:不及时的接收缓冲区内的包,造成多个包接收。

    避免粘包问题的方法:

     1. 对于定长的包,保证每次都按固定大小读取即可;//  结构体

     2. 对于变长的包,还可以在包和包之间使用明确的分隔符,这个分隔符是由程序员自己来定的,只要保证分隔符不和正文冲突即可。


     
TCP报文头

    标志位:
    
    1. URG: 紧急指针标志, 为1时表示紧急指针有效, 该报文应该优先传送。
    2. ACK: 确认应答标志
    3. PSH:  表示发送数据,提示接收端从TCP接收缓冲区中读走数据,为接收后续数据腾出空间
    4. RST: 重置连接标志
    5. SYN: 表示请求建立一个连接
    6. FIN: finish标志, 表示释放连接
    

    滑动窗口大小:是TCP流量控制得一个手段。目的是告诉对方, 本端得TCP接受缓冲区还能容纳多少字节得数据,
                这样对方就可以控制发送数据的速度,从而达到流量控制,16bit,因而窗口最大65535.
                

 TCP的机制


    TCP复杂是因为它既要保证可靠性,同时又要尽可能的提高性能。

    可靠性:

        (1)三次握手和四次挥手机制
        
         (2) 确认应答:TCP将每个字节的数据都进行了编号,即为序列号。每一个ACK都带有对应的确认序列号,保证数据不丢失的按序到达

        (3)超时重传:当发送端发送的数据在网络中丢失时,在一定时间内没有收到接收端的ACK,则发送端会重新发送丢失数据。

        (4)流量控制:按照ACK中“窗口大小”字段控制发送端的发送速度


    提高性能:

        (1)滑动窗口:可以按照“窗口大小”, 一次发送多条后, 再等待应答。

        (2)延迟应答:当接收方处理速度很快时,可以延迟发送ACK,此时"窗口大小"会自动增大

        (3)捎带应答:搭载应用层的响应报文发送ACK。


 

客户端与服务端的全双工通信。

 使用tcp网络通信发送视频以及图片

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

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

相关文章

数据结构:队列(顺序存储和链式存储)

文章目录 1. 队列的概念和结构2. 队列的链式存储实现2.1 初始化2.2 判断队列是否为空2.3 入队列2.4 出队列2.5 取队头数据2.6 取队尾数据2.7 队列有效数据的个数2.8 打印队列数据2.9 销毁2.10 源代码 3. 队列的顺序存储实现(循环队列)3.1 初始化3.2 判断队列是否为空3.3 判断队…

【数据结构之C语言实现动态顺序表】

引 入: 在讲顺序表之前得先了解线性表是什么? 线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列,字符串…… 线性表…

Meta 发布地表最大、最强大模型 Llama 3.1

最近这一两周看到不少互联网公司都已经开始秋招提前批了。不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解…

【iOS】暑期第一周——ZARA app仿写

目录 前言无限轮播图分栏控件和滚动视图自定义cell遇到的问题调整图标大小单元格附件视图设置 总结 前言 暑假学习的第一周任务是对ZARA app进行仿写,充分运用之前学习的Objective-C语言和UI控件。我在编写demo的过程中遇到了一些问题,特写该博客作为学习…

LLM与搜索推荐

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

VScode连接服务器免密登录

1、生成 SSH 密钥对 打开终端并输入以下命令生成 SSH 密钥对: 直接搜索 cmd,然后输入: ssh-keygen -t rsa -b 4096 一直回车就好了 这时公钥存储在/Users/你的用户名/.ssh/id_rsa.pub文件里,私钥存储在/Users/你的用户名/.ss…

简单的数据结构:栈

1.栈的基本概念 1.1栈的定义 栈是一种线性表,只能在一端进行数据的插入或删除,可以用数组或链表来实现,这里以数组为例进行说明 栈顶 :数据出入的那一端,通常用Top表示 栈底 :相对于栈顶的另一端,也是固…

黑马头条vue2.0项目实战(一)——项目初始化

1. 图标素材(iconfont简介) 制作字体图标的工具有很多,推荐使用:iconfont-阿里巴巴矢量图标库。 注册账户 创建项目 可以根据项目自定义 class 前缀 上传图标到项目 生成链接,复制 css 代码,在项目中使用…

【知识梳理】Shell的变量计算

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 Shell中有很多变量的计算,会用到多种运算符。例如这几种: 1. Shell中常见的算术运算符 运算符意义&…

github-page静态网页将字符串写入github库中文本文档

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 问题描述 github-page静态…

Natutre Methods|单细胞+空间转录,值得去复现的开源单细胞分析pipeline

肺癌是全球第二大最常见的癌症,也是癌症相关死亡的主要原因。肿瘤生态系统具有多种免疫细胞类型。尤其是髓系细胞,髓系细胞普遍存在,并且在促进疾病方面发挥着众所周知的作用。该篇通过单细胞和空间转录组学分析了 25 名未经治疗的腺癌和鳞状…

网络模型优化——从参数向量到性能提升的最优化之旅

网络模型优化——从参数向量到性能提升的最优化之旅 网络模型优化的核心作用 组件/步骤描述参数向量网络模型中的可学习部分,决定了模型的输出泛函最优化通过调整参数向量以最小化或最大化某个目标函数的过程目标函数用于评估模型性能的指标,如损失函数…

【初阶数据结构篇】顺序表的实现(赋源码)

文章目录 本篇代码位置顺序表和链表1.线性表2.顺序表2.1 概念与结构2.2分类2.2.1 静态顺序表2.2.2 动态顺序表 2.3 动态顺序表的实现2.3.1动态顺序表的初始化和销毁及打印2.3.2动态顺序表的插入动态顺序表的尾插动态顺序表的头插动态顺序表的在指定位置插入数据 2.3.3动态顺序表…

区块链——hardhat使用

一、引入hardhat yarn add --dev hardhat // 引入验证合约的插件 yarn add --dev nomicfoundation/hardhat-verify 二、创建hardhat项目 yarn hardhat 三、编写我们的合约 四、编译我们的合约 yarn hardhat compile 五、编写脚本部署合约以及验证合约 // 获取hardhat环境对象 c…

Python操作Redis指南

文本主要介绍使用Python中的redis-py库来操作Redis数据库,包括安装必要的包、建立和关闭连接、执行增删改查操作以及处理可能的异常。这些操作将在Python应用程序中与Redis数据库进行有效的交互。 一. 简介和包的安装 Redis是一种开源的内存数据结构存储&#xff…

Jmeter混合压测(2407)

一 压测需求: 电商作为服务端,至少需要满足并发量,QPS:100/s,TPS:20/s。例如场景: 电商交易中,商品图片请求量最多,电商服务端需要满足并发请求查询图片信息。各家可能会并发请求同一家电商商品、订单等内容。 二 压…

代码随想录算法训练营day7 | 454.四数相加II、383.赎金信、15.三数之和、18.四数之和

文章目录 454.四数相加II思路 383.赎金信思路 15.三数之和思路剪枝去重 18.四数之和思路剪枝去重复习:C中的类型转换方法 总结 今天是哈希表专题的第二天 废话不多说,直接上题目 454.四数相加II 建议:本题是 使用map 巧妙解决的问题&#x…

HarmonyOS(45) 控件拖动或者拖拽PanGesture

PanGesture实现控件拖动的效果,通过拖动的坐标位置调用position或者translate方法来更新UI的位置。效果见下图: 具体代码如下: // xxx.ets Entry Component struct PanGestureExample {State offsetX: number 0State offsetY: number 0pos…

【AI学习指南】轻量级模型-用 Ollama 轻松玩转本地大模型

目录 探索 最小的AI模型 发现 其他轻量级模型 用 Ollama 轻松玩转本地大模型 本地大模型 Ollama 快速上手 安装 手动安装 下载ollama二进制文件 添加 Ollama 作为启动服务(推荐) 安装 CUDA 驱动程序(可选 - 适用于 Nvidia GPU) 安装 ROCm(可选 - 对于 Radeo…

Typesript的type和interface的异同?

详解TypeScript中type与interface的区别_javascript技巧_脚本之家 一、相同的地方 1、都可以用来定义对象,描述函数 我们在用typescript开发的时候经常要用到数据类型定义,比如我们写一个接口或者函数的时候定义传参数据类型及字段等。这样子方便知道这…