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后 关闭连接


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
分布式计算 API Linux
通义千问API:找出两篇文章的不同
本章我们将介绍如何利用大模型开发一个文档比对小工具,我们将用这个工具来给互联网上两篇内容相近但版本不同的文档找找茬,并且我们提供了一种批处理文档比对的方案
|
弹性计算 负载均衡 网络协议
这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
【2月更文挑战第20天】这种情况可能是由于阿里云的API服务出现了短暂的故障或者网络波动导致的
280 1
|
2月前
|
JSON 监控 网络协议
干货分享“对接的 API 总是不稳定,网络分层模型” 看电商 API 故障的本质
本文从 OSI 七层网络模型出发,深入剖析电商 API 不稳定的根本原因,涵盖物理层到应用层的典型故障与解决方案,结合阿里、京东等大厂架构,详解如何构建高稳定性的电商 API 通信体系。
|
10月前
|
网络协议
网络通信的基石:TCP/IP协议栈的层次结构解析
在现代网络通信中,TCP/IP协议栈是构建互联网的基础。它定义了数据如何在网络中传输,以及如何确保数据的完整性和可靠性。本文将深入探讨TCP/IP协议栈的层次结构,揭示每一层的功能和重要性。
497 5
|
10月前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
186 13
|
10月前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
1114 2
|
网络协议 网络架构 数据格式
TCP/IP基础:工作原理、协议栈与网络层
TCP/IP(传输控制协议/互联网协议)是互联网通信的基础协议,支持数据传输和网络连接。本文详细阐述了其工作原理、协议栈构成及网络层功能。TCP/IP采用客户端/服务器模型,通过四个层次——应用层、传输层、网络层和数据链路层,确保数据可靠传输。网络层负责IP寻址、路由选择、分片重组及数据包传输,是TCP/IP的核心部分。理解TCP/IP有助于深入掌握互联网底层机制。
1388 2
|
JavaScript 网络协议 API
【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败
【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败
125 3
|
机器学习/深度学习 API 算法框架/工具
【Tensorflow+keras】Keras API三种搭建神经网络的方式及以mnist举例实现
使用Keras API构建神经网络的三种方法:使用Sequential模型、使用函数式API以及通过继承Model类来自定义模型,并提供了基于MNIST数据集的示例代码。
173 12
|
机器学习/深度学习 API 算法框架/工具
【Tensorflow+keras】Keras API两种训练GAN网络的方式
使用Keras API以两种不同方式训练条件生成对抗网络(CGAN)的示例代码:一种是使用train_on_batch方法,另一种是使用tf.GradientTape进行自定义训练循环。
135 5

热门文章

最新文章