Posix API与网络协议栈实现原理
本文分享自零声教育学员的学习总结
一、Posix简介
1.1 什么是Posix(Portable Operating System Interface of UNIX )
Posix,意为可移植操作系统接口,它定义了操作系统应该为应用程序提供的接口标准。
1.2 作用
Posix标准旨在期望获得源代码级别的木心源码软件可移植性。在不同操作系统中,如Linux与Windows,编写的应用程序能够实现一致的接口使用,确保源代码在多种环境下都能正常运行。
二、Posix网络API
2.1 网络编程客户端与服务端常用API
客户端与服务端通常会使用socket、listen、connect、accept等核心API进行网络连接与通信。
2.2 客户端和服务端代码示例
示例代码展示了服务端server.cpp和客户端client.cpp的基本结构与逻辑。
运行结果展示了连接成功后的通信交互。
相关视频推荐
推荐学习视频包括《tcp/ip详解》、《了解网络协议栈那些不为人知的八股文》等,帮助深入理解网络协议与实现。
三、关键函数分析
2.3.1 socket函数
调用socket()函数创建套接字对象,由文件描述符和TCP控制块组成,后者记录了网络连接的详细信息,如五元组。
2.3.2 listen 函数
服务端通过listen()监听连接请求,45级复仇源码参数backlog指定队列长度,表示一次最多能保存多少个连接请求。
2.3.3 connect 函数
客户端通过connect()向服务端发起连接请求。
2.3.4 accept 函数
accept()取出连接请求,为连接分配文件描述符并返回。
2.3.6 常见面试问题
解答了为什么需要三次握手、服务器端口如何处理大量连接、如何应对Dos攻击等问题。
四、数据收发
2.4 send/recv 函数
send/recv负责数据收发,实现客户端与服务端间的信息交换。
2.4.2 常见面试问题
介绍了解决粘包问题的方法与TCP如何确保顺序到达的数据传输。
五、连接关闭与状态机
2.5 close 函数
close()关闭socket描述符,涉及四次挥手过程。
2.5.2 常见面试题
解答了time_wait状态与服务器端口被占用时的解决方法。
本文深入探讨了Posix API与网络协议栈的实现原理,涵盖了网络编程的常用API、关键函数分析、数据收发机制、连接关闭流程以及面试问题解答等内容,为深入理解网络通信与系统接口设计提供了详细的指导。
什么是POSIX 1.0?
POSIX是可移植操作系统接口(Portable Operating System Interface)的首字母缩写。POSIX是基于UNIX的,这一标准意在期望获得源代码级的教务签到系统源码软件可移植性。换句话说,为一个POSIX兼容的操作系统编写的程序,应该可以在任何其它的POSIX操作系统(即使是来自另一个厂商)上编译执行。POSIX标准定义了操作系统应该为应用程序提供的接口:系统调用集。POSIX是由IEEE(Institute of Electrical and Electronic Engineering)开发的,并由ANSI(American National Standards Institute)和ISO(International Standards Organisation)标准化。大多数的操作系统(包括Windows NT)都倾向于开发它们的变体版本与POSIX兼容。
POSIX1.0是其中一种.
从HotSpot源码,深度解读 park 和 unpark
我最近建立了一个在线自习室(App:番茄ToDO)用于相互监督学习,感兴趣的小伙伴可以加入。自习室加入码:D5A7A
Java并发包下的类大多基于AQS(AbstractQueuedSynchronizer)框架实现,而AQS线程安全的实现依赖于两个关键类:Unsafe和LockSupport。
其中,Unsafe主要提供CAS操作(关于CAS,在文章《读懂AtomicInteger源码(多线程专题)》中讲解过),LockSupport主要提供park/unpark操作。实际上,park/unpark操作的最终调用还是基于Unsafe类,因此Unsafe类才是核心。
Unsafe类的实现是由native关键字说明的,这意味着这个方法是原生函数,是用C/C++语言实现的,并被编译成了DLL,由Java去调用。
park函数的数字滚动效果源码作用是将当前调用线程阻塞,而unpark函数则是唤醒指定线程。
park是等待一个许可,unpark是为某线程提供一个许可。如果线程A调用park,除非另一个线程调用unpark(A)给A一个许可,否则线程A将阻塞在park操作上。每次调用一次park,需要有一个unpark来解锁。
并且,unpark可以先于park调用,但不管unpark先调用多少次,都只提供一个许可,不可叠加。只需要一次park来消费掉unpark带来的许可,再次调用会阻塞。
在Linux系统下,park和unpark是通过Posix线程库pthread中的mutex(互斥量)和condition(条件变量)来实现的。
简单来说,mutex和condition保护了一个叫_counter的信号量。当park时,这个变量被设置为0,当unpark时,这个变量被设置为1。当_counter=0时线程阻塞,当_counter>0时直接设为0并返回。带状决策公式源码
每个Java线程都有一个Parker实例,Parker类的部分源码如下:
由源码可知,Parker类继承于PlatformParker,实际上是用Posix的mutex和condition来实现的。Parker类里的_counter字段,就是用来记录park和unpark是否需要阻塞的标识。
具体的执行逻辑已经用注释标记在代码中,简要来说,就是检查_counter是不是大于0,如果是,则把_counter设置为0,返回。如果等于零,继续执行,阻塞等待。
unpark直接设置_counter为1,再unlock mutex返回。如果_counter之前的值是0,则还要调用pthread_cond_signal唤醒在park中等待的线程。源码如下:
(如果不会下载JVM源码可以后台回复“jdk”,获得下载压缩包)
POSIXPOSIX简介
POSIX,全称为可移植操作系统接口(Portable Operating System Interface),由电气和电子工程师协会(IEEE)制定,其初衷是提升在UNIX环境下的应用程序的移植性。这个标准并不局限于UNIX系统,许多其他操作系统,如DEC OpenVMS,也支持POSIX,特别是IEEE Std. .1-(年修订版),即通常所说的POSIX.1。POSIX.1为C语言应用提供了源代码级别的API,使得应用程序能访问操作系统的服务,如文件的读写操作。这个标准已被国际标准化组织(ISO)接纳,正式名称为ISO/IEC -1:。 Windows NT平台下的系统并不直接支持更新版的POSIX接口,仅支持最初的ISO/IEC -1:版本。由于这种限制,Windows NT系统无法创建符合POSIX规范的线程和窗口、套接字。为了解决这个问题,微软提供了Microsoft POSIX subsystem软件包(Windows Services for UNIX),以支持新版POSIX接口。此外,Windows系统还支持其他POSIX兼容层,比如Cygwin。 随着技术的发展,POSIX已经发展成为一个庞大的标准体系,包含多个组成部分。例如,表1-1列出了POSIX标准的一些关键部分。值得注意的是,POSIX与IEEE 和家族的标准是可以互换使用的,除了.1,这些系列也在表中有所体现。扩展资料
POSIX是Portable Operating System Interface of Unix的缩写。由IEEE(Institute of Electrical and Electronic Engineering)开发,由ANSI和ISO标准化。 POSIX的诞生和Unix的发展是密不可分的,Unix于年代诞生于贝尔实验室,并于年代向美各大高校分发V7版的源码以做研究。加利福尼亚大学伯克利分校在V7的基础上开发了BSD Unix。后来很多商业厂家意识到Unix的价值也纷纷以贝尔实验室的System V或BSD为基础来开发自己的Unix,较著名的有Sun OS,AIX,VMS。POSIX网络API解析
网络中进程之间如何通信?网络通信需借助唯一标识进程的标志,即三元组(ip地址,协议,端口)。TCP/IP协议族提供此标识,应用编程接口如UNIX BSD的套接字(socket)与UNIX System V的TLI(淘汰)用于网络进程通信。
POSIX标准定义了操作系统为应用程序提供的接口标准,以期望实现源代码级别的软件可移植性。不同内核提供的系统调用不同,如Linux的fork与Windows的createprocess。POSIX标准出现为解决移植问题,使得使用统一接口,如将fork封装为posix_fork,可跨平台移植。
网络编程常用API包括socket、bind、listen、connect与accept。socket创建句柄与TCB,bind指定地址,listen监听连接请求,connect发起请求,accept接收请求建立连接。
网络字节序与主机字节序不同,网络传输使用大端字节序。进行数据传输前需将主机字节序转换为网络字节序。
三次握手流程:客户端调用connect发起请求,服务器接收SYN,添加TCB至半连接队列,客户端接收ACK后连接建立,服务器将TCB移至全连接队列,调用accept返回连接描述字。
send与recv负责数据收发,将数据拷贝至内核缓冲区,根据策略发送或接收。close关闭连接,使socket描述字不可用,四次挥手完成连接断开。
System v 和Posix
在Linux系统中进行进程间通信时,我们常常会遇到System v和POSIX两种类型的接口。POSIX,全称Portable Operating System Interface for Computing Systems,是由IEEE和ISO/IEC合作制定的一套标准,旨在确保应用程序在不同操作系统上源代码级别的移植性。它源于年代早期的UNIX用户组工作,旨在统一System V(由AT&T开发)和Berkeley BSD系统之间的调用接口,最终在年发布了POSIX.1标准(IEEE .1-)。
System V,最初称为AT&T System V,是Unix众多版本中的一员,由AT&T开发于年,历经多个版本,其中SVR4(System V Release 4)最为成功,影响了诸如初始化脚本(/etc/init.d)等UNIX共同特性。System V不仅仅局限于AT&T的硬件,许多转售版本如Dell SVR4和Bull SVR4也基于其。如今,SCO OpenServer基于System V Release 3,而SUN Solaris和SCO UnixWare则基于SVR4。System V被视为UNIX两种主要风格(另一是BSD)之一,但随着Linux和QNX等非传统实现的出现,这一分类不再准确。标准化努力如POSIX致力于减少不同实现之间的差异。
System V和POSIX在Linux/unix系统编程中扮演着接口协议的角色,POSIX相对System V更新,语法简洁。进程间通信(IPC)是两者共同关注的领域,POSIX IPC中对象有名称,如mq_open、sem_open、shm_open中的名称并不一定对应文件系统。创建或打开IPC对象时,需要指定操作模式,如读写权限。而System V IPC中,key_t类型在msget、semget、shmget等函数中扮演关键角色。
2024-11-20 17:10
2024-11-20 16:55
2024-11-20 15:07
2024-11-20 14:55
2024-11-20 14:48