Linux网络编程必备的POSIX API的细节

简介: Linux网络编程必备的POSIX API的细节

POSIX API大集合

五元组

(sip, sport, dip, dport, protocol)

三次握手的过程, 内核协议栈分析

内核协议栈中是有内核数据结构的.  


我们send/write数据, 都是先发送到内核协议栈中,然后由内核协议栈封装发送到物理介质中传输到对端的


对端的接收过程也是经有内核协议栈进行解包, 最终对端应用层获取数据.

三次握手的过程是由客户端的用户通过connect系统调用发起的


由内核协议栈之间完成三次握手. 建立连接的.


第一次握手的时候, 会根据五元组生成一个 node 挂载到半连接队列syn队列中.


第三次握手的时候会根据五元组的信息定位半连接队列中对应的node结点将其移动到accept queue中去.  


accept函数则是根据accept中的一个结点为其分配一个fd并且return  

connect调用之后客户端处于 syn-sent状态  + 服务端接收到第一次握手数据包的时候处于  syn-recv状态.


listen函数

int listen(int sockfd, int backlog);

unix系统中,backlog 是syn队列+accept队列的最大值;


linux系统中,backlog是accept队列的最大值。


至此我非常向提到一个东西叫做

DDOS攻击, 洪水攻击

eg : 在syn上做文章.  不断的向服务器发出syn请求, 请求和服务器建立连接, 恶意的占满服务器的syn队列. 使得正常的普通客户无法和服务器正常建立联系, 无法获取服务.


这个就算最为初级的syn洪水了


还可以利用反射机制,达到借刀杀人的效果


就是将目标服务器ip填写为源ip地址和其他机器请求建立连接.


这样其他机器误以为是服务器想要建立连接, 就会不断的向服务器发送syn + ack包, 这样服务器也会疲于处理大量的无效syn + ack包而无法正常运作


甚至还有更为牛逼的放大攻击.


利用服务器的ip地址发送DNS请求, 然后对于DNS请求而言, 一般是发送一个请求报文远远小于响应报文的, 这样就可以达到放大的效果. 放大垃圾数据攻击服务器.

DDOS 攻击的应对措施

在服务器前面放一台巨大的堡垒机. 让其拦截掉恶意请求.过滤连接请求. 达到净化的效果

数据发送

其实针对数据的send/write是从用户态拷贝到内核协议栈的内核缓冲区中的,然后由内核协议栈不断地进行层层封包, 最后放到物理介质传输到对端, 对端接收到数据报, 在根据头部信息分用, 最终将数据传到应用层

怎么保证顺序?如何保证包地顺序到达(序号 + 确认应答机制 + 重传)

延迟ack,解决包的有序的问题. 就不见ack, 会在最近序号没有收到ack位置及其之后所有的包全部重传, 这样就可以保证一定是顺序到达地. 后面地包先到也没用,还是会丢弃重传. (保证顺序)

重传费带宽, 所以有些时候需要考虑udp, 比如在弱网环境下, 也就是网络环境非常差劲地情况下.


实时性强的场景,也可以选择udp


udp使用场景:

  1. 游戏,利用UDP的实时性;
  2. 迅雷下载,使用UDP传输,抢占带宽;TCP有拥塞控制,对带宽进行控制。

TCP断开连接的过程

tcp连接的断开过程. 是由客户端发起的close。然后内核协议栈会向对端发送一个fin包, 同时主动发起方进入fin_wait1状态, 然后对端收到fin包,先回一个ack然后被动的进入close_wait状态. 为何此处的fin + ack不可以何在一起, 因为服务器端很可能还需要向客户端发送未发送完的数据. 发送完之后才会进行close.

问题1. 大量的CLOSE_WAIT + FIN_WAIT2是为啥?

服务端没有处理断开连接的逻辑, 收到客户端的fin包,关闭了读端之后没有进行close。(没有close的逻辑)

time_wait状态存在的原因?

避免最后一次ack的丢失, 如果服务器久收不到客户端发送过来的ack包,也就是被动方久收不到ack就会重新发送fin,这个时候不等,不就没了嘛。 为了让服务端正常断开这条连接, 于是等待time_wait = 2MSL。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
16天前
|
安全 Linux 虚拟化
网络名称空间在Linux虚拟化技术中的位置
网络名称空间(Network Namespaces)是Linux内核特性之一,提供了隔离网络环境的能力,使得每个网络名称空间都拥有独立的网络设备、IP地址、路由表、端口号范围以及iptables规则等。这一特性在Linux虚拟化技术中占据了核心位置🌟,它不仅为构建轻量级虚拟化解决方案(如容器📦)提供了基础支持,也在传统的虚拟机技术中发挥作用,实现资源隔离和网络虚拟化。
网络名称空间在Linux虚拟化技术中的位置
|
16天前
|
网络协议 安全 Linux
Linux网络名称空间之独立网络资源管理
Linux网络名称空间是一种强大的虚拟化技术🛠️,它允许用户创建隔离的网络环境🌐,每个环境拥有独立的网络资源和配置。这项技术对于云计算☁️、容器化应用📦和网络安全🔒等领域至关重要。本文将详细介绍在Linux网络名称空间中可以拥有的独立网络资源,并指出应用开发人员在使用时应注意的重点。
|
16天前
|
安全 网络协议 Linux
Linux网络名称空间概述
Linux网络名称空间是操作系统级别的一种虚拟化技术🔄,它允许创建隔离的网络环境🌐,使得每个环境拥有自己独立的网络资源,如IP地址📍、路由表🗺️、防火墙规则🔥等。这种技术是Linux内核功能的一部分,为不同的用户空间进程提供了一种创建和使用独立网络协议栈的方式。本文旨在全方面、多维度解释Linux网络名称空间的概念、必要性和作用。
Linux网络名称空间概述
|
14天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
38 6
|
5天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
|
17天前
|
网络协议 Linux
在Linux中,管理和配置网络接口
在Linux中管理网络接口涉及多个命令,如`ifconfig`(在新版本中被`ip`取代)、`ip`(用于网络设备配置)、`nmcli`(NetworkManager的CLI工具)、`nmtui`(文本界面配置)、`route/ip route`(处理路由表)、`netstat/ss`(显示网络状态)和`hostnamectl/systemctl`(主机名和服务管理)。这些命令帮助用户启动接口、设置IP地址、查看连接和路由信息。不同发行版可能有差异,建议参考相应文档。
19 4
|
2天前
|
网络协议 Linux Shell
【linux网络(一)】初识网络, 理解四层网络模型
【linux网络(一)】初识网络, 理解四层网络模型
|
2天前
|
安全 Ubuntu Linux
Linux 网络操作命令Telnet
Linux 网络操作命令Telnet
16 0
Linux 网络操作命令Telnet
|
3天前
|
Ubuntu Linux
Linux(22) Linux设置网络优先级顺序
Linux(22) Linux设置网络优先级顺序
5 0
|
4天前
|
Ubuntu 网络协议 Linux
Linux(20) Ubuntu 20.04 网络接口自动切换路由配置
Linux(20) Ubuntu 20.04 网络接口自动切换路由配置
27 0