网络编程之 listen()函数的使用与三次握手的理解

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: listen()函数在进入我们的函数讲解前大家再回顾一下编写服务器端的流程

listen()函数

在进入我们的函数讲解前大家再回顾一下编写服务器端的流程
服务器端:
socket()-->bind( )-->listen()-->accept()-->read()/write()--->close()
socket()//创建套接字
bind()//分配套接字地址
listen()//等待连接请求状态
accept()//允许连接
read()/write()//进行数据交换
close()//断开连接

相信大家对 socket()和 bind()应该不陌生了,那我们就再接再厉把 listen() 也拿下吧。


下面博主给出具体的函数


#include<sys/socket.h>
int listen(int sock, int backlog);
参数含义:
  第一个参数: int sock: 希望进入等待连接请求状态的套接字文件描述符,传递的描述符套接字参数成为服务器端套接字(监听套接字!!!!)
  第二个参数: int backlog: 连接请求等待队列的长度,若为5,则队列长度为5,表示最多使5个连接请求进入队列,其中也包含排队建立3次握手队列和刚刚建立3次握手队列的连接数之和
返回值:    成功: 0
          失败: -1

 

 典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accept()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept的客户端就处于连接等待状态,listen()声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接待状态,如果接收到更多的连接请求就忽略。

博主认为下面这两张图对我们的两个参数解释得非常形象,就分享给大家看了。

20191031200321579.png

20191031200404428.png

查看系统默认backlog


cat /proc/sys/net/ipv4/tcp_max_syn_backlog


如何设置操作系统中backlog的值??

按照下面的步骤操作即可:


vim /etc/sysctl.conf


最后添加


net.core.somaxconn = 1024


net.ipv4.tcp_max_syn_backlog = 1024


保存,然后执行,就能更改系统默认的backlog


为什么要去更改backlog呢??

因为 listen()第二个参数表面上是让你自己设置,但是一旦你设置的数字超过了系统默认的 backlog那么系统就会选择默认的 backlog 你设置的参数就不起作用了。


三次握手

下面就有博主给大家分享一些比较专业的知识了(博主也许讲的不是很好,但是博主会尽自己最大努力去讲好的)------>介绍的是 TCP 首先让我们看下下面的图(重点注意红色的箭头)

20191031201508490.png


下面这张图就包含了三次握手和四次挥手(在后面的内容会介绍到的


20191031201642741.png

1.首先客户端(client)发一个SYN 1000(0字节)请求给客户端,希望与服务器建利连接

2.服务器端(server)接收到之后返回ACK(接受客户端发来的字节数 1000+1),在发送SYN 8000(0)字节同时也希望和客户端建立连接。


3.客户端接收到服务器端的ACK回应之后再返回ACK(服务器端发来的SYN 8000+1)给服务器端,这样客户端和服务器端就建立了连接。


这就是三次握手,通俗的来说就是:


-

套接字A:"你好,套接字B。我这里有数据要传递给你,我们建立连接吧"


-

套接字B:“好的,我这边已就绪”


-

套接字A:“谢谢你受理我的请求”


书上的图:(更容易理解): ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20191031203439767.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RlYXJRaUhhbw==,size_16,color_FFFFFF,t_70)

如果其中的数据不一样就会发生下面的情况(给出书上),这也就是为什么说 TCP是面向连接的、可靠的、数据完整的基于字节流的连接的原因了。

20191031202351912.png


其中的原理就是 SYN与ACK做的。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
用MASM32按Time Protocol(RFC868)协议编写网络对时程序中的一些有用的函数代码
用MASM32按Time Protocol(RFC868)协议编写网络对时程序中的一些有用的函数代码
|
1月前
|
机器学习/深度学习 编解码
深度学习笔记(三):神经网络之九种激活函数Sigmoid、tanh、ReLU、ReLU6、Leaky Relu、ELU、Swish、Mish、Softmax详解
本文介绍了九种常用的神经网络激活函数:Sigmoid、tanh、ReLU、ReLU6、Leaky ReLU、ELU、Swish、Mish和Softmax,包括它们的定义、图像、优缺点以及在深度学习中的应用和代码实现。
126 0
深度学习笔记(三):神经网络之九种激活函数Sigmoid、tanh、ReLU、ReLU6、Leaky Relu、ELU、Swish、Mish、Softmax详解
|
1月前
|
机器学习/深度学习 数据可视化 算法
激活函数与神经网络------带你迅速了解sigmoid,tanh,ReLU等激活函数!!!
激活函数与神经网络------带你迅速了解sigmoid,tanh,ReLU等激活函数!!!
|
3月前
|
机器学习/深度学习 算法
神经网络中激活函数的重要性
【8月更文挑战第23天】
31 0
|
3月前
|
监控
【网络编程】poll函数
【网络编程】poll函数
29 0
|
3月前
|
监控
【网络编程】select函数
【网络编程】select函数
65 0
|
3月前
|
机器学习/深度学习 Shell 计算机视觉
一文搞懂 卷积神经网络 卷积算子应用举例 池化 激活函数
这篇文章通过案例详细解释了卷积神经网络中的卷积算子应用、池化操作和激活函数,包括如何使用卷积算子进行边缘检测和图像模糊,以及ReLU激活函数如何解决梯度消失问题。
|
4月前
|
机器学习/深度学习
神经网络可能不再需要激活函数?Layer Normalization也具有非线性表达!
【7月更文挑战第14天】研究表明,层归一化(LayerNorm)可能具备非线性表达能力,挑战了神经网络对激活函数的依赖。在LN-Net结构中,仅使用线性层与LayerNorm就能实现复杂分类,其VC维度下界证明了非线性表达。尽管如此,是否能完全替代激活函数及如何有效利用这一特性仍需更多研究。[arXiv:2406.01255]
58 5
|
4月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于负相关误差函数的4集成BP神经网络matlab建模与仿真
**算法预览:** 图像显示无水印的2022a版MATLAB运行结果 **软件版本:** MATLAB 2022a **核心代码片段:** 省略展示 **理论概述:** NCL集成BP网络利用负相关提升泛化,结合多个弱模型减少错误关联。通过λ参数控制模型间负相关程度,λ&gt;0增强集成效果,提高预测准确性和系统稳健性。
|
4月前
|
存储 Java Unix
(八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。