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

news/2024/7/8 4:35:49

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 


http://lihuaxi.xjx100.cn/news/2085922.html

相关文章

C++构造函数详解

目录 如果对你有帮助&#xff0c;点个赞吧&#xff01; 构造函数&#xff1a; 1、函数名与类名相同 2、无返回值 3、对象实例化时编译器自动调用对用的构造函数 4、构造函数可以重载 5、如果我们没有显式定义构造函数&#xff0c;编译器会自动生成一个构造函数&#xff…

蓝桥杯历年真题 java b组 2015年 第六届 牌型种数

一、题目 牌型种数 小明被劫持到X赌城&#xff0c;被迫与其他3人玩牌。 一副扑克牌&#xff08;去掉大小王牌&#xff0c;共52张&#xff09;&#xff0c;均匀发给4个人&#xff0c;每个人13张。 这时&#xff0c;小明脑子里突然冒出一个问题&#xff1a; 如果不考虑花色&…

系统质量属性与架构评估

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/136565452 一. 软考系统质量属性 1、软件系统质量属性是一个系统的可测量或可测试的属性&#xff0c;基于软件系统的生命周期&#xff0c;可将软件系统的质量属性分为开发期质量属性和运行期质量属性 …

后端八股笔记------Redis

Redis八股 上两种都有可能导致脏数据 所以使用两次删除缓存的技术&#xff0c;延时是因为数据库有主从问题需要更新&#xff0c;无法达到完全的强一致性&#xff0c;只能达到控制一致性。 一般放入缓存中的数据都是读多写少的数据 业务逻辑代码&#x1f447; 写锁&#x1f4…

不要在代码中随便使用try...catch了

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 背景 js中的try...catch try...catch运行机制 js的事件循环机制 try...c…

如何在Linux部署FastDFS文件服务并实现无公网IP远程访问内网文件——“cpolar内网穿透”

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

c++中static的作用

在 C 中&#xff0c;static 关键字可以用于变量、函数和类成员&#xff0c;具体作用如下&#xff1a; 静态变量&#xff08;Static Variables&#xff09;&#xff1a; - 用于在函数内部声明的静态变量会保留其值&#xff0c;直到程序的生命周期结束。 - 静态局部变量只会…

游戏中主流的护甲计算

文章目录 1、护甲1.1、主流的护甲函数1.2、护甲穿透1.3、护甲穿透&#xff08;按百分比&#xff09;1.3、格挡 2、攻速和DPS3、暴击3.1、暴击率3.2、暴击伤害 4、最后一题 1、护甲 1.1、主流的护甲函数 当护甲>0时&#xff0c;护甲函数如下&#xff1a; 伤害减免 1 − 1 …