网站建设的常用软件有哪些wordpress增加搜索框
网站建设的常用软件有哪些,wordpress增加搜索框,怎样做能直接上传微信的视频网站,企业名录搜索软件 2022上篇文章#xff1a;C/C Linux网络编程12 - 传输层UDP协议详解-CSDN博客 代码仓库#xff1a;橘子真甜 (yzc-YZC) - Gitee.com TCP是传输层协议#xff0c;特点是#xff1a;保证可靠传输#xff0c;面向字节流#xff0c;有连接。 目录
一. TCP报头格式
二. TCP 面向字…上篇文章C/C Linux网络编程12 - 传输层UDP协议详解-CSDN博客代码仓库橘子真甜 (yzc-YZC) - Gitee.comTCP是传输层协议特点是保证可靠传输面向字节流有连接。目录一. TCP报头格式二. TCP 面向字节流1.1 面向字节流理解1.2 粘包问题三. TCP 有连接⭐3.1 连接准备3.2 三次握手3.4 四次挥手3.3 思考总结⭐⭐a 如果出现了大量的close_wait状态怎么办b 为什么要有time_wait状态c time_wait的危害是什么如何解决四. TCP可靠性下篇文章详解一. TCP报头格式首先我们来了解TCP报头格式可以看到TCP报头前20字节160位是固定的。如果需要数据和选项可以增加。既然这样TCP报头总长度并不是固定的。如果获取TCP报头的大小呢可以看到TCP首部有一个字段4位首部长度这个就是用于计算的。TCP首部长度 4位首部长 * 4 字节。假如 4位首部长是 1111那么该TCP首部长是 1111(15) * 4 60字节可以看到TCP首部最长就是60字节最短是固定首部长20字节和UDP一样TCP报文也是一个结构化数据二. TCP 面向字节流1.1 面向字节流理解TCP是面向字节流的使用socket构建tcp的套接字时候会创建发送缓冲区和接受缓冲区。我们调用接口 recv/send/read/write时候会先将数据拷贝到对应的接收缓冲区中。而什么时候发送缓冲区发送数据发送多少。什么时候接受缓冲区接受数据接受多少。丢包了怎么办。都由底层自己完成。而我们的用户只需要向缓冲区拷贝/读取数据即可还可以支持全双工。1.2 粘包问题由于TCP是面向字节流的所以我们读取数据的时候并不能保证读取的数据是一个完整的报文有可能多有可能少这就是粘包问题。为了解决这种问题我们要明确每一个报文的边界。常用的解决方式如下1 通信双方规定一个报文是定长的每次读取定长的数据2 通过特殊字符对报文进行划分比如\r\n3 报头定义报文的长度每一次去读取标明的长度数据三. TCP 有连接⭐TCP保持连接的目的是为了可靠性做基础。有了连接方便支持可靠性的实现。3.1 连接准备TCP的连接不是直接就能连接的连接前需要做一些准备。被动接收连接方一般为服务端1首先要socket创建套接字构建fd和tcp控制块2 bind绑定端口完善tcp控制块3 isten创建半连接队列syc_queue和全连接队列 accept_queue 将自己设置为LISTEN状态只有这个状态才能获取网络的连接。我们的listen函数 listen(int fd, int backlog) 的第二个参数就全连接队列的长度主动连接方一般为客户端1 socket创建套接字构建fd和tcp控制块2 connect 连接远方服务器一般os会自动帮助我们bind一个端口。注意connect是三次握手的开始3.2 三次握手这里假设是server-client双方准备好连接后此时server处于LISTEN状态client处于close状态1 client调用connect开始连接首先client向server发送一个SYN x表明自己想要建立连接。2 server接收syn后如果判断可以连接就会向client发送 ACK x 1表示同意连接请求 和 自己的SYN y表示确认连接请求。此时该连接也进入了半连接队列。3 然后client接收到 ACK x 1 和 SYN y 之后如果确认同意连接就发送一个 ACK y 1表示同意确立连接请求。此时连接仍处于半连接队列。4 当server接收到来自client的ACK y 1 之后三次握手就完成了理论是完成了。此时连接由半连接队列进入全连接队列。然后当server调用accpet获取这个连接之后双方就能正常send/recv通信了。流程如下图思考三次握手中有哪些api调用connect发起三次握手listen为三次握手做准备accpet最后接收三次握手建立的连接。Tcp第三次握手之后如何从半连接队列中拿出匹配的连接放入全连接队列服务端通过TCP五元组找到半连接队列放入全连接队列。3.4 四次挥手网络编程中调用close fd当返回0说明这个连接就断开了。调用close之后双方是如何处理的呢其实是通过四次挥手处理的。1 调用close前双方处于ESTABLISHED状态。2 主动断开方首先调用close发送fin表示需要断开连接并进入fin_wait1状态。3 被动断开方接收fin后进入close_wait状态并发送一个ack表示同意你的断开请求然后等待上层调用close调用close后发送fin表示我也要断开连接进入last_ack状态。4 主动断开方接收ack之后进入fin_wait2状态等待对方的fin接收到对方的fin后发送ack表示我也同意你的断开请求并进入time_wait状态表示等待对方接收完毕超时进入closed状态5 被动界的收到ack之后进入closed状态。至此四次挥手就完毕了一般是主动关闭方超时2MSL进入closed状态结束流程图如下3.3 思考总结⭐⭐由四次挥手可知主动断开方最后进入time_wait状态。被动断开方不调用close会一直处于close_wait状态a如果出现了大量的close_wait状态怎么办这种情况一般是服务器压力过大没时间close或者有bug无法正确close。前者想要解决只能等待压力减轻后更换设备或者更换方案了后者bug需要修改代码即可。b为什么要有time_wait状态time_wait状态大量出现其实是正常状态作用是防止主动断开方的最后一个ack丢包被动断开方一直超时重传 fin 无法从 last_ack 进入closed。time_wait超时2 MSL最大报文生存时间期间可以保证对方接受ack。防止网络中有延迟数据没有被接收导致的数据错误ctime_wait的危害是什么如何解决服务器关闭后由于我们的端口处于time_wait此时重启会bind失败。这个问题的危害由于time_wait持续的时间是2 MSL这个期间我们的服务是停止的这是一个巨大的损失。比如双11如图淘宝两分钟无法服务会造成巨大的影响。解决这个问题可以使用setsockopt来设置端口复用正常来说一个五元组只能bind一个端口。而使用了setsockopt可以保证多个五元组bind同一个端口并且保证不出错。这样就能保证我们的服务器关闭后可以快速重启。代码如下我截取自己服务器的代码void initServer() { // 1.创建套接字,使用tcp协议 _listensockfd socket(AF_INET, SOCK_STREAM, 0); if (_listensockfd 0) { LogMessage(FATAL, creat socket error); exit(SOCKET_ERR); } LogMessage(NORMAL, creat listensocket success:%d, _listensockfd); // 1.2 设置地址复用 int opt 1; setsockopt(_listensockfd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, opt, sizeof(opt)); // 2.bind绑定自己的网络信息sockfd与IP和port struct sockaddr_in local; memset(local, 0, sizeof(local)); local.sin_family PF_INET; // AF_INET就是PF_INET local.sin_port htons(_port); local.sin_addr.s_addr INADDR_ANY; if (bind(_listensockfd, (sockaddr *)local, sizeof(local)) 0) { LogMessage(FATAL, server bind error); exit(BIND_ERR); } LogMessage(NORMAL, server bind success); // 3. tcp需要建立连接 设置监听状态获取新连接 if (listen(_listensockfd, gbacklog) -1) { LogMessage(FATAL, server listen error); exit(LISTEN_ERR); } LogMessage(NORMAL, server listen success); }参数说明SO_REUSEADDR允许重用处于 TIME_WAIT 状态的地址或同一IP的不同服务复用。它解决的是 TIME_WAIT 和地址冲突问题。如果完全冲突的两个服务都活跃是无法bind的time_wait状态就是一种不活跃的状态所以可以bindSO_REUSEPORT允许多个独立套接字绑定到完全相同的 IP:端口。用于多进程/线程同时监听同一端口实现高性能。完全冲突的两个服务都也是可以bind的四. TCP可靠性下篇文章详解可靠性内容较多下篇文章详解TCP可靠性包含TCP 报头各个字段作用确认应答超时重传连接管理本文已有流量控制滑动窗口拥塞控制。