首页 > 系统相关 >Linux软件高级编程-网络--TCP通信--day14

Linux软件高级编程-网络--TCP通信--day14

时间:2024-03-13 09:00:34浏览次数:24  
标签:文件 epoll -- TCP day14 int 描述符 fd

TCP包头:

1.序号:发送端发送数据包的编号
2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用)


TCP为什么安全可靠:

1.在通信前建立三次握手连接

    SYN
    SYN+ACK 
    ACK 

2.在通信过程中通过序列号和确认号保障数据传输的完整性

    本次发送序列号:上次收到的确认号
    本次发送确认号:上次接收到的序列号 + 实际接收的数据长度

  在传输过程中使用滑动窗口实现流量控制

3.在通信结束时使用四次挥手结束连接保障数据传输的完整性
 

UDP和TCP的区别:

    1.UDP和TCP都是传输层的协议
    2.UDP实现机制简单、资源开销小、不安全不可靠
    3.TCP实现机制复杂、资源开销大、安全可靠
    4.UDP是无连接的、TCP有连接的、UDP是以数据包形式传输、TCP是以流的方式传输


HTTP:

1.URL

   <协议>://<主机>:<端口>/<路径>

    协议:HTTP       80         TCP 
          HTTPS     443         TCP 
    主机:  域名  ->  域名解析服务器 -> IP地址
    端口: 可以省略, HTTP 80
                    HTTPS 443
    路径: 想要获得对应的资源


2.HTTP交互过程:

    1.建立TCP连接
    2.发送HTTP请求报文
    3.回复HTTP相应报文
    4.关闭TCP连接

TCP并发模型:

1.TCP多线程模型:

               缺点:1.创建线程会带来资源开销,能够实现的并发量比较有限 

2.IO模型:

     1.阻塞IO:

               没有数据到来时,可以让任务挂起,节省CPU资源开销,提高系统效率

     2.非阻塞IO:

              程序未接收到数据时一直执行,效率很低

     3.异步IO

              只能绑定一个文件描述符用来读取数据

    4.多路复用IO
      select

            1.select监听的集合中的文件描述符有上限限制
            2.select有内核层向用户层数据空间拷贝的过程,占用系统资源开销
            3.select必须轮询检测产生事件的文件描述符
            4.select只能工作在水平触发模式(低速模式),无法工作在边沿触发(高速模式)

       poll

            1.poll有内核层向用户层数据空间拷贝的过程,占用系统资源开销
            2.poll必须轮询检测产生事件的文件描述符
            3.poll只能工作在水平触发模式(低速模式),无法工作在边沿触发(高速模式)

3.函数接口:

1.select 

int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);
      功能:
        select监听文件描述符集合中是否有文件描述编程ready状态
      功能:
        nfds:最大文件描述符的值+1 
        readfds:读文件描述符集合
        writefds:写文件描述符集合
        exceptfds:其余文件描述符集合
        timeout:等待的时长
            NULL 一直等待
      返回值:
        成功返回文件描述符集合中的文件描述符个数
        失败返回-1 

void FD_CLR(int fd, fd_set *set);

功能:将文件描述符fd从集合中清除 

int  FD_ISSET(int fd, fd_set *set);

 功能:判断文件描述符fd是否仍在集合中 

void FD_SET(int fd, fd_set *set);

功能:将文件描述符fd加入到集合中

void FD_ZERO(fd_set *set);

 功能:将文件描述符集合清0 

2.poll  

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

功能:

监听文件描述符集合是否有事件发生

参数:

fds:监听文件描述符集合数组空间首地址
        nfds:监听文件描述符集合元素个数
        timeout:等待的时间(-1 一直等待)

返回值:

成功返回产生事件的文件描述符个数
        失败返回-1 

 struct pollfd {
        int   fd;         /* file descriptor */
        short events;     /* requested events */
        short revents;    /* returned events */
    };

fd:监听的文件描述符
    events:要监听的事件  POLLIN:是否可读  POLLOUT:是否可写
    revents:实际产生的事件 

    3.epoll 

 int epoll_create(int size);
      功能:
        创建一张内核事件表
      参数:
        size:事件的个数
      返回值:
        成功返回文件描述符
        失败返回-1 
    
      epoll_ctl 
      int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
      功能:
        维护epoll时间表
      参数:
        epfd:事件表的文件描述符
        op:
            EPOLL_CTL_ADD   添加事件
            EPOLL_CTL_MOD   修改事件
            EPOLL_CTL_DEL   删除事件
        fd:
            操作的文件描述符
        event:
            事件对应的事件 
        
        typedef union epoll_data {
            void        *ptr;
            int          fd;
            uint32_t     u32;
            uint64_t     u64;
        } epoll_data_t;

        struct epoll_event {
            uint32_t     events;      /* Epoll events */
            epoll_data_t data;        /* User data variable */
        };

      返回值:
        成功返回0 
        失败返回-1 

      epoll_wait 
      int epoll_wait(int epfd, struct epoll_event *events,
                      int maxevents, int timeout);
      功能:
        监听事件表中的事件
      参数:
        epfd:文件描述符
        events:存放实 际产生事件的数组空间首地址
        maxevents:最多存放事件的个数
        timeout:设定监听的时间(超过该时间则不再监听)
        -1 一直监听直到有事件发生
      返回值:
        成功返回产生事件的文件描述符个数
        失败返回-1 
        如果时间达到仍没有事件发生返回0 

标签:文件,epoll,--,TCP,day14,int,描述符,fd
From: https://blog.csdn.net/hddhlhlhl/article/details/136633585

相关文章

  • c++初阶------类和对象(下)
    作者前言......
  • 监控大模型训练
    监控大模型训练大模型训练时间久,而且过程中容易出现各种各样的问题而中断,中断之后不及时续练的话对GPU资源是很大的浪费,但是我们又不能一直盯着程序。所以本文将介绍如何编写一个监控程序来监控大模型的训练,以方便我们在大模型训练出现异常时及时通知给我们。监控的方式有很多,这......
  • 为什么defineProps宏函数不需要从vue中import导入?
    前言我们每天写vue代码时都在用defineProps,但是你有没有思考过下面这些问题。为什么defineProps不需要import导入?为什么不能在非setup顶层使用defineProps?defineProps是如何将声明的props自动暴露给模板?举几个例子我们来看几个例子,分别对应上面的几个问题。先来看一个正常的......
  • 基于YOLOv5s的电动车入梯识别系统(数据集+权重+登录界面+GUI界面+mysql)
             本人训练的yolov5s模型,准确率在98.6%左右,可准确完成电梯内检测电动车任务,并搭配了GUI检测界面,支持权重选择、图片检测、视频检测、摄像头检测、识别结果拍照和在线标注数据集等功能。        并且为用户提供了登录注册功能,使用mysql数据库进行存储......
  • 【JavaEE初阶系列】——多线程 之 创建进程
    目录......
  • <2024最新>ChatGPT逆向教程
    前言在使用本篇文章用到的项目以及工具时,需要对其有一定的了解,无法访问以及无法使用的问题作者不承担任何责任,可以自行想办法解决遇到的问题​。文章若有不合适,有问题的地方,请私聊指出,谢谢~准备工具一台至少2核2G内存的服务器,推荐是位于香港、新加坡或日本地区的服......
  • LeetCode题练习与总结:最长有效括号
    一、题目给你一个只包含'(' 和')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。二、解题思路1.初始化一个栈和一个变量maxLen来记录最长有效括号子串的长度。栈用于存储左括号的索引,maxLen初始化为0。2.遍历字符串s中的每个字符。对于每个字符,执行以下......
  • 动手学深度学习Pytorch 2.3线性代数-笔记
    标量标量——仅包含一个数值,由只有一个元素的张量表示变量——未知的标量值例,将华氏度值转换为摄氏度的计算表达式​,其中5、9、32为标量,c和f为变量。实例化两个标量并进行算术运算 importtorch ​ x=torch.tensor(3.0) y=torch.tensor(2.0) print(x+y,x......
  • 【Spark编程基础】实验二Spark和Hadoop的安装(附源代码)
    文章目录一、实验目的二、实验平台三、实验内容和要求1.HDFS常用操作2、Spark读取文件系统的数据四、实验过程一、实验目的(1)掌握在Linux虚拟机中安装Hadoop和Spark的方法;(2)熟悉HDFS的基本使用方法;(3)掌握使用Spark访问本地文件和HDFS文件的方法。二、......
  • JavaWeb-Maven基础
    Maven是专门用于管理和构建Java项目的工具,是Apache下的一个纯Java开发的开源项目,基于项目对象模型(POM)概念。先来学习一下Maven基础,等后面学完开发框架后再学Maven高级,这次的内容如下一、概述1、简介Maven是专门用于管理和构建Java项目的工具,主要功能1)提供了一套标......