socket网络编程

简介: (*´▽`)ノノ在讲网络编程之前,首先要了解下网络的架构。我们都知道TCP/IP网络模型共有7层:第一层网络接口层:将osi的物理层和数据链路层合二为一。物理层 是网络的传输介质层,处于网络的最低层,是网络的载体。

- 网络编程


QQ_20180808145955


在讲网络编程之前,首先要了解下网络的架构。

我们都知道TCP/IP网络模型共有7层:
第一层网络接口层:将osi的物理层和数据链路层合二为一。物理层 是网络的传输介质层,处于网络的最低层,是网络的载体。利用物理介质对上次网络提供物理连接。常用的设备哟网卡、集线器、中继器、调制解调器、网线等。数据链路层:在这层,将数据进行分帧,并进行流的控制,屏蔽物理层,为上层(网络层)提供数据链路的连接。本层进行硬件寻址(MAC地址,ARP协议)。
第三层网络层:本层通过寻址来建立两个节点之间的连接,为上层(运输层)提供链路传输功能。负责建立和维护连接,拥塞控制等。(IP协议)
第四层传输层:面向连接和无连接的传输。(tcp,udp,端口)
第五层应用层:不多说

两个在不同网络的主机程序进程进行通信的流程为:
S(Server):传输层打开一个端口,绑定socket套接字,进行监听端口,等待外部的连接。
如果外部有连接,则Accept,

A(client):先建立一个socket套接字,连接到服务器

- 设置TIME_WAIT的原因

可靠地实现TCP全双工连接的终止
TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。
因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态
允许老的重复分节在网络中消逝
TCP分节可能由于路由器异常而“迷途“,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。

QQ_20180808145824

- 并发服务器

QQ_20180808145936

pid_t pid;
int listenfd,connfd;
listenfd = socket(...);
bind(listenfd...);
listen(listenfd,LISTENQ);
for( ; ; ){
    connfd = accept(listenfd,...);
    if( (pid = Fork()) == 0){
        close(listenfd);   // child closes listening socket
        doit(connfd);     // process the request
        close(connfd);    // done with this client
        exit(0);
    }
    close(connfd);   // parent closes connected socket
}

针对一个TCP套接字调用close会导致发送一个FIN,随后是正常的TCP连接终止序列。但是在上面福进程首先调用close(connfd),会什么没有终止连接呢。
我们必须知道每个文件或者套接字都有一个引用计数。引用计数在文件表象中维护着。在创建listenfd的时候,引用计数为1,当复制到子进程的时候,引用计数为2,这么一来,当父进程关闭connfd的时候,他只是把相应的引用计数减为1.该套接字的真正清理应该等引用计数变为0才会发生。

相关文章
|
12月前
|
人工智能 Ubuntu IDE
【Python】基础:环境配置与基础语法
本文介绍了Python编程语言及其环境配置方法。Python由Guido van Rossum于1991年创建,以其简洁、易学和强大的功能著称。文章详细讲解了Python的主要特点、Windows和Ubuntu下的安装配置步骤、基础语法、控制流、函数、文件操作、模块使用及面向对象编程等内容,帮助读者快速入门Python编程。
318 4
|
中间件 Java 应用服务中间件
Windows部署web应用服务器Jboss中间件
如何在Windows系统上部署JBoss 7.1作为Web应用服务器,包括配置环境变量、自动部署WAR包、访问JBoss控制台、设置管理员账户以及修改端口和绑定地址等操作。
449 1
|
JSON Java Maven
如何批量查询自己的CSDN博客质量分
如何批量查询自己的CSDN博客质量分
497 0
|
消息中间件 应用服务中间件 网络安全
定时器方案:红黑树、最小堆和时间轮的原理
定时器方案:红黑树、最小堆和时间轮的原理
318 0
|
12月前
|
人工智能 Serverless
AI助理精准匹配------助力快速搭建Stable Difussion图像生成应用
【10月更文挑战第7天】过去在阿里云社区搭建Stable Diffusion图像生成应用需查阅在线实验室或官方文档,耗时且不便。现阿里云AI助理提供精准匹配服务,直接在首页询问AI助理即可获取详细部署步骤,简化了操作流程,提高了效率。用户可按AI助理提供的步骤快速完成应用创建、参数设置、应用部署及资源释放等操作,轻松体验Stable Diffusion图像生成功能。
|
11月前
|
网络协议 Java 网络安全
如何处理“协议异常”错误
当遇到“协议异常”错误时,通常需要检查网络连接、防火墙设置和软件版本。确保所有组件都是最新的,并尝试重新启动设备或应用程序。如果问题持续存在,请联系技术支持以获取进一步的帮助。
812 59
|
机器学习/深度学习 人工智能 UED
OpenAI o1模型:AI通用复杂推理的新篇章
OpenAI发布了其最新的AI模型——o1,这款模型以其独特的复杂推理能力和全新的训练方式,引起了业界的广泛关注。今天,我们就来深入剖析o1模型的特点、背后的原理,以及一些有趣的八卦信息。
653 73
|
12月前
|
存储 分布式计算 druid
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!(一)
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!(一)
159 1
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!(一)
|
消息中间件 安全 API
Apache RocketMQ ACL 2.0 全新升级
RocketMQ ACL 2.0 不管是在模型设计、可扩展性方面,还是安全性和性能方面都进行了全新的升级。旨在能够为用户提供精细化的访问控制,同时,简化权限的配置流程。欢迎大家尝试体验新版本,并应用在生产环境中。
189451 271
|
12月前
|
JSON 前端开发 JavaScript
【简单粗暴】如何使用 React 优化 AG 网格性能
【简单粗暴】如何使用 React 优化 AG 网格性能
260 3