POSIX API与网络协议栈

简介: POSIX API与网络协议栈

本文介绍linux中与tcp网络通信相关的POSIX API,在每次调用的时候,网络协议栈会进行的操作与记录。

POSIX API

Posix API,提供了统一的接口,使程序能得以在不同的系统上运行。简单来说不同的操作系统进行同一个活动,比如打开文件,所调用的函数是不同的。系统1调用的是open1函数,系统2调用的是open2函数,在Posix API中统一规定把这个功能的函数包装成open,那么当应用程序在不同的系统上调用open函数的时候就都能打开文件了。

应用程序可能会有自己的打开文件函数,比如popen,fopen等等,都是在直接或间接的调用open。

网络协议栈

网络协议栈是内核的一部分,是一系列网络协议的集合。负责网络通信和网络数据传输。

tcp网络通信相关的POSIX API

socket

socket通俗的翻译是插座,插座分为插头和座,socket函数实际上是实现了网络通信中建立连接所需要的“插头”和“座”。在网络通信中,“插头”对应着socketfd,“座”对应着tcp控制块。

socketfd存在于用户空间中,Tcp协议是网络协议栈的一部分,tcp控制块又是tcp协议的一部分。

Tcp控制块包含了以下内容:源IP地址和源端口、目标IP地址和目标端口、连接状态、序列号和确认号、窗口大小、拥塞控制参数、超时和重传信息、接收和发送缓冲区、计时器、选项和标志。

bind

给socetkfd的tcp控制块的目的IP地址和目的端口赋值。有些客户端不绑定一个特定的端口,那么系统就会随机分配。

listen与connect

Listen函数的第二个参数是在设置syn_queue与accept_queue的总长度。listen函数主要在做两件事:

a.修改tcp控制块的连接状态,发生连接前后分别是LISTEN状态和ESTABLISH状态。

b.建立syn_queue(同步队列)和accept_queue(接受队列)。syn_queue用于存储未完成的三次握手的连接请求控制块,accept_queue用于存储刚刚完成了3次握手的连接请求控制块,等待移交给accept函数进行处理。

三次握手介绍

客户端连接到服务器需要首先进行三次握手,这三次握手是在底层进行的。服务器在listen状态,客户端调用connect之后,就在进行三次握手了,整个过程对于用户是黑箱的。作为高水平程序员,我们还是需要来了解下底层到底是怎么样的运作机制。

首先了解tcp头,需要重点了解的是控制位(Flags),包括了8块内容:CWR、ECE、URG、ACK、PSH、RST、SYN、FIN,这些内容位要么填1,要么填0,用于控制和标识TCP连接的状态和行为。比如客户端发起了第一次握手,会往服务器发送一个tcp包,这个包会包含包头和没有数据的包体(包括后面的两次握手也是),这时候SYN被设置为1,说明是第一次握手。

三次握手的流程如图所示,以下的一根蓝线代表一次握手:

第一次握手,发送一个tcp包,这个包包头的SYN位置被设为1,seqnum被随机生成,比如是12345,由客户端发送给服务器。请求进入到了服务器的syn队列中,随即建立相应的请求控制块。

第二次握手,服务器返回一个包,这个包包头的SYN和ACK被设为1,客户端发送的12345的seqnum,收到12345的acknum。服务器也随机生成了一个seqnum,比如34531。

第三次握手,客户端发送了一个tcp包,于是服务器发送的是34531的seqnum,收到的34532的acknum。收到多大的acknum,表示seqnum小于这个acknum的tcp包都已经全部被对端接收过了。相应的请求控制块从syn队列移动到accept队列中。

通过seqnum和acknum的数值排序,可以实现tcp通信的不重复、不乱序、不缺失。

3个问题

  1. 连接的生命周期是什么时候开始的?从服务器第一次接收到tcp包开始。
  2. 第三次握手结束,accept队列是如何从syn队列中找到对应的请求控制块的?根据源ip和源port查找。
  3. Syn泛洪是什么?是一种网络攻击手段,简单来说就是黑客不断地通过第一次握手并且不回应第二次握手,把syn队列塞满,导致服务器无法建立新的连接。目前已经通过堡垒机、防火墙等手段拦截了该手段。

accept

Accept函数做了两件事:

a.     根据取出的连接请求控制块,建立新的fd,也就是通常新的clientfd。

b.     为这个新的fd建立新的tcp控制块。

send与write

tcp通信的这两个函数其实只做一件事,就是把数据从应用层appliacation,拷贝进入内核kenerl的发送缓冲区中。至于内核什么时候把数据发送到对端,就不一定了,有可能是先凑满一定的字符数再一起发送,有可能是看到一定时间内都没有数据再拷贝进入就发送,不同的系统会有不同的操作。我们可以通过ifconfig命令查看mtu,也就是单个数据包中可以传输的最大字节数。

recv和read

tcp通信的这两个函数其实也只做了一件事,就是把数据从内核的接收缓冲区拷贝到应用层。

close

该函数是负责断开客户端与服务器之间的连接。底层的流程通常称为“四次挥手”。不同于发起连接只能由客户端发起,断开连接可以由任意一方启动,只分为主动方和被动方。

Close函数做了两部分工作:a.回收fd。b.发送一个控制位FIN为1的包(第一次挥手),也叫fin包或final包,这个包的包体没有任何内容,于是对端的recv会返回0。

当对端接收到FIN包之后,通常会返回一个ack包,再调用close函数返回一个fin包(第二、三次挥手)。本端收到fin包之后再返回一个ack包(第四次挥手)。

下图是close主动方与被动方的挥手关系与状态变化:

红圈对应着主动方与被动方的状态变化。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
弹性计算 负载均衡 网络协议
这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
【2月更文挑战第20天】这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
70 1
|
2月前
|
分布式计算 API Linux
通义千问API:找出两篇文章的不同
本章我们将介绍如何利用大模型开发一个文档比对小工具,我们将用这个工具来给互联网上两篇内容相近但版本不同的文档找找茬,并且我们提供了一种批处理文档比对的方案
|
15天前
|
网络协议 Linux SDN
虚拟网络设备与Linux网络协议栈
在现代计算环境中,虚拟网络设备在实现灵活的网络配置和隔离方面发挥了至关重要的作用🔧,特别是在容器化和虚拟化技术广泛应用的今天🌐。而Linux网络协议栈则是操作系统处理网络通信的核心💻,它支持广泛的协议和网络服务🌍,确保数据正确地在网络中传输。本文将深入分析虚拟网络设备与Linux网络协议栈的关联,揭示它们如何共同工作以支持复杂的网络需求。
|
2月前
|
机器学习/深度学习 人工智能 API
人工智能应用工程师技能提升系列2、——TensorFlow2——keras高级API训练神经网络模型
人工智能应用工程师技能提升系列2、——TensorFlow2——keras高级API训练神经网络模型
33 0
|
3月前
|
网络协议 Linux API
Posix API与网络协议栈
Posix API与网络协议栈
128 0
|
15天前
|
缓存 前端开发 API
API接口封装系列
API(Application Programming Interface)接口封装是将系统内部的功能封装成可复用的程序接口并向外部提供,以便其他系统调用和使用这些功能,通过这种方式实现系统之间的通信和协作。下面将介绍API接口封装的一些关键步骤和注意事项。
|
21天前
|
监控 前端开发 JavaScript
实战篇:商品API接口在跨平台销售中的有效运用与案例解析
随着电子商务的蓬勃发展,企业为了扩大市场覆盖面,经常需要在多个在线平台上展示和销售产品。然而,手工管理多个平台的库存、价格、商品描述等信息既耗时又容易出错。商品API接口在这一背景下显得尤为重要,它能够帮助企业在不同的销售平台之间实现商品信息的高效同步和管理。本文将通过具体的淘宝API接口使用案例,展示如何在跨平台销售中有效利用商品API接口,以及如何通过代码实现数据的统一管理。
|
1月前
|
安全 算法 API
产品经理必备知识——API接口
前言 在古代,我们的传输信息的方式有很多,比如写信、飞鸽传书,以及在战争中使用的烽烟,才有了著名的烽火戏诸侯,但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代,我通过一部手机就可以实现衣食住行的方方面面,比如:在家购物、远程控制家电、自动驾驶等等,背后都离不开我们今天要聊的API接口。
|
1月前
|
数据采集 JSON API
如何实现高效率超简洁的实时数据采集?——Python实战电商数据采集API接口
你是否曾为获取重要数据而感到困扰?是否因为数据封锁而无法获取所需信息?是否因为数据格式混乱而头疼?现在,所有这些问题都可以迎刃而解。让我为大家介绍一款强大的数据采集API接口。
|
1天前
|
Java API Android开发
[NDK/JNI系列04] JNI接口方法表、基础API与异常API
[NDK/JNI系列04] JNI接口方法表、基础API与异常API
7 0