Posix API与网络协议栈(一)

简介: Posix API与网络协议栈

前言


本文主要介绍 Posix API与网络协议栈


对于POSIX的介绍.在《UNIX环境高级编程》中的描述是:


POSIX是一个由 IEEE(电气和电子工程师学会 )制订的标准族。 POSIX的意思是计算机环境

的可移植操作系统界面(Portable Operating System Interface for Computer Environment)。


这边可以理解是为 POSIX 是为Unix操作系统开发制定的一套标准


Posix API包括


1.socket
2.bind
3.listen
4.accept
5.recv
6.send
7.close
8.connect //作为客户端连接服务端时使用

 本专栏知识点是通过零声教育的线上课学习,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以点击链接 C/C++后台高级服务器课程介绍 详细查看课程的服务。


提示:以下是本篇文章正文内容,下面案例可供参考


一、TCP三个阶段


1.建立连接


   三次握手


三次握手是发送在哪个函数里面: 当客户端调用connect函数连接 服务端


当客户端第一个次发送SYC到达服务端时, 服务端会构建一个包(结构体: 结构体中包含客户端的信息) 加入队列(半连接队列)中, 当服务端收到客户端的ACK包时,同样也会构建一个队列(全连接队列), 会从半连接队列中找是否有这个客户端的包, 如果有就放到全连接队列中, 这个连接(握手)的节点 叫做 TCP控制块(tcb)


半连接队列:syn queue


全连接队列:  accept queue


如何通过网络数据包, 查找到半连接队列的节点(TCB)


五元组:(sip(源IP),  dip(目的IP), sport(源端口), dport(目的端口), proto(协议))


端口只有65535个, 如何做到百万级别的连接


一个连接底层就是一个tcb,tcb的唯一性就是五元组, 一个连接对应一个五元,只要五元不冲突就可以依次增加


测试百万连接并发,要开100个端口


从五元组的角度来说 源IP只有1个,目标IP也只有一个,源端口(客户端端口不可被控制只有65535个),那么三个客户端并发请求最多只能支撑3*65535 个连接,于是只能通过增大服务端的端口来使五元组能扩展的更多(如果有足够多的客户端机器(源端口),那么一个目的端口也可以实现百万连接)


POSIX API 实现

1.listen,


在socket fd创建时, 底层会有一个tcb的存在,listen 把tcb设置成listen(被监听 可连接)的状态。(后续全连接队列, 半连接队列创建的前提)


2.accept


当连接队列为空时, 等待阻塞


当连接进入全连接队列后, accept 函数产生client fd

clientfd = accept(listenfd, addr, addrlen);

3.connect


fd查找到对应的tcb,通过tcb 对 地址发送syn包


connect(fd, serveraddr, size)

4.bind


socket(插座), 一个socket由两部分组成 fd 跟 tcb, 当创建socket 时会产生一个 fd,使用bind 把 fd 跟tcb进行绑定


不会对tcb进行状态改变,此时tcb还是处于closed状态


bind(ip, port)

2.传输数据

    send(): 把数据 copy 到内核(tcb)中,什么时候发送数据到对端,发送多少数据由网络协议栈决定 。通过对端的ACK(确认值)回传,确定对端有没有收到数据。


    recv(): 通过接收过来的包组成五元组 获取到fd,查到对应的tcb 放到recv buff里,应用层调用recv函数读数据,每次读取多少数据由应用程序决定


最大传输单元(Maximum Transmission Unit, MTU):  数据链路层传输的帧大小限制


TCP 最大段大小(Max Segment Size,MSS): TCP 为了避免被发送方分片,会主动把数据分割成小段再交给网络层,最大的分段大小称之为 MSS(MSS = MTU - IP header头大小 - TCP 头大小)


3.断开连接

  close : 将首部标志状态位 FIN 置为 1


  shutdown: 单向的socket便称为半开放Socket, 要实现半开放式,需要用到shutdown()函数


四次挥手:  从下图看 SERVER B 收到 SERVER A的关闭连接请求后, 把ACK 跟 FIN 分开发送, 因为延迟确认的存在, 第二步的ACK跟第三步的FIN包 经常会合在一起发送给对端(三次挥手)


当 SERVER A 收到 SERVER B 的 FIN 以后, 只能确认SERVER B 不会再发送数据给自己了,但是自己这个时候还是可以发送数据给 SERVER B,这个时候的状态也叫 FINWAIT_1


当 SERVER A 收到 SERVER B 的 FIN 以后回传给 SERVER B 确认ACK包,表示我已经收到这个FIN包了,同时自己进入了 CLOSING 状态中


等待 SERVER A 给自己发 自己FIN包 的 ACK(确保对面知道自己要关闭连接了),如果收到以后就会进入TIME-WAT


在TIME-WAIT 状态持续 2*MSL后 关闭连接


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
弹性计算 负载均衡 网络协议
这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
【2月更文挑战第20天】这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
91 1
|
1月前
|
分布式计算 API Linux
通义千问API:找出两篇文章的不同
本章我们将介绍如何利用大模型开发一个文档比对小工具,我们将用这个工具来给互联网上两篇内容相近但版本不同的文档找找茬,并且我们提供了一种批处理文档比对的方案
|
2天前
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
9 3
|
25天前
|
编解码 前端开发 Java
Java网络API之Netty深度解析
Java网络API之Netty深度解析
24 0
|
1月前
|
网络协议 Linux SDN
虚拟网络设备与Linux网络协议栈
在现代计算环境中,虚拟网络设备在实现灵活的网络配置和隔离方面发挥了至关重要的作用🔧,特别是在容器化和虚拟化技术广泛应用的今天🌐。而Linux网络协议栈则是操作系统处理网络通信的核心💻,它支持广泛的协议和网络服务🌍,确保数据正确地在网络中传输。本文将深入分析虚拟网络设备与Linux网络协议栈的关联,揭示它们如何共同工作以支持复杂的网络需求。
|
1月前
|
存储 网络协议 安全
POSIX API与网络协议栈
POSIX API与网络协议栈
46 0
|
1月前
|
机器学习/深度学习 人工智能 API
人工智能应用工程师技能提升系列2、——TensorFlow2——keras高级API训练神经网络模型
人工智能应用工程师技能提升系列2、——TensorFlow2——keras高级API训练神经网络模型
54 0
|
1月前
|
网络协议 Linux API
Posix API与网络协议栈
Posix API与网络协议栈
136 0
|
3天前
|
自然语言处理 安全 API
触发邮件接口有哪些?邮件API文档
**触发邮件接口**如AokSend、Mailgun、Amazon SES、Postmark和Sendinblue是自动化企业通信的关键。这些接口在特定事件时自动发送邮件,提高效率和客户体验。例如,AokSend提供详细的API文档,支持事件触发、模板管理和多语言集成;Mailgun以灵活性著称;Amazon SES适合大规模发送;Postmark专注于事务邮件;Sendinblue则提供邮件、短信和营销自动化功能。每种服务都有示例代码展示如何使用API发送邮件。选择合适的接口能提升企业通信效率和客户满意度。
|
4天前
|
安全 API 网络安全
API接口安全加固:应对黑客攻击的实战指南
**API安全摘要:** API成为黑客目标,攻击类型包括未授权访问、CSRF、DDoS、数据泄露和注入攻击。防御策略包括使用OAuth 2.0和JWT进行认证授权,防止CSRF攻击,限制请求速率,避免数据泄露,以及实施注入攻击防护。开发者应定期更新安全措施,确保API安全性。示例代码展示了Node.js中JWT认证的实现。

热门文章

最新文章