当前位置: 首页 > news >正文

Linux下的网络通讯

UDP:用户数据报协议  传输层
特点:
    1.无连接
    2.不安全、不可靠
    3.面向报文
    4.占用资源开销小
    
TCP : 传输控制协议   传输层

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

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


2. 编程模型

   client: socket--->connect--->send/write--->close
   server:    socket--->bind--->listen--->accept---> recv/read--->close
    
3. 函数接口:
    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 

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


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

    粘包问题出现的原因: 

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

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

    避免粘包问题的方法:

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

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


     
5. TCP报文头

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

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

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

    可靠性:

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

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

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


    提高性能:

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

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

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

=======================================================================

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 电测量数据交换DLMS_COSEM组件第47部分:基于IP网络的DLMS_COSEM传输层
  • Linux用户-普通用户
  • 树上dp学习总结2
  • SpringMVC中的常用注解
  • stl-algorithm【1】
  • 【错误总结】Ubuntu系统中执行 sudo apt-get update报错
  • 随着人工智能技术的发展,如何确保其决策过程的透明度和可解释性,以避免潜在的不公正和歧视?
  • 入门 PyQt6 看过来(案例)18~ 表格属性
  • 【MATLAB源码】机器视觉与图像识别技术实战示例文档---鱼苗面积预测计数
  • 机器学习模型选择与优化: 打造智能IDS
  • 程序员面试中的“八股文”:敲门砖还是绊脚石?
  • M12电连接器的编码分类及应用领域分析
  • 在Linux上编译软件并且运行的入门示例
  • 同城校园跑腿外卖配送平台源码,这套目前全网还没有人分享过
  • 技术学习笔记2:std::bad_cast 在多态编程中有什么作用,如何避免类型转换失败?
  • Android框架之Volley
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CSS 提示工具(Tooltip)
  • git 常用命令
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JS变量作用域
  • Lsb图片隐写
  • Mysql5.6主从复制
  • Vue 重置组件到初始状态
  • vue中实现单选
  • 测试如何在敏捷团队中工作?
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 聊一聊前端的监控
  • 前端面试题总结
  • 前端相关框架总和
  • 深度学习中的信息论知识详解
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • Prometheus VS InfluxDB
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​业务双活的数据切换思路设计(下)
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • # .NET Framework中使用命名管道进行进程间通信
  • # C++之functional库用法整理
  • #### go map 底层结构 ####
  • #QT(串口助手-界面)
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $(function(){})与(function($){....})(jQuery)的区别
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (接口自动化)Python3操作MySQL数据库
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (四)opengl函数加载和错误处理
  • (算法)区间调度问题