论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
数据库
›
Oracle
›
TCP三次握手,四次挥手;多历程、多线程实现并发服务器 ...
TCP三次握手,四次挥手;多历程、多线程实现并发服务器 ...
惊雷无声
论坛元老
|
2025-3-10 19:10:16
|
显示全部楼层
|
阅读模式
楼主
主题
1005
|
帖子
1005
|
积分
3015
三次握手,四次挥手
三次握手示意图:
SYN、ACK是TCP协议头里面的标志位
同步 SYN:仅在三次握手建立 TCP 毗连时有效。当 SYN = 1 而 ACK = 0 时,表明这是一个毗连哀求报文段,对方若同意建立毗连,则应在相应的报文段中使用 SYN = 1 和 ACK = 1。因此,SYN 置1 就体现这是一个毗连哀求或毗连继承报文
ACK:确认 ACK:仅当 ACK=1 时确认号字段才有效,TCP 规定,在毗连建立后所有传达的报文段都必须把 ACK 置1
ack是32位确认号,期望收到对方下一个报文段的第一个数据字节的序号每当有ACK了,确认号都要加一
客户端: CLOSED -> SYN-SEND -> ESTABLISHED
服务端:CLOSED -> LISTEN -> SYN-RECV -> ESTABLISHED
为什么不能是其他次数?
通讯双方都要知道对方具备发送和继承的能力,如许才是一个良好的关系
两次大概会导致资源的浪费,由于服务器不知晓发送端是否具有接收信息的能力,所以每一次接收信息他都会发一个确认收到和哀求SYN的信息。
四次是可以的,只是会造成资源的浪费,末了优化成三次
四次挥手示意图
无论是hi哪一方都可以主动发出断开毗连
断开毗连的一方 : FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT
被断开的一方:CLOSE_WAIT -> LAST_ACK
为什么不能是其他次数?
TCP是全双工通讯,可以双向传输数据,任何一方都可以再数据传送结束之后发出毗连释放的通知,待接收方确认之后进入半关闭状态。这会大概接收方另有信息要发给哀求断链方,因此还没有向对方发一个“我也哀求断链”的消息。当接收方发的东西发完之后,接收方就可以向哀求断联方发FIN“我要断开”的消息,主动断开毗连的一方,末了会进入一个 TIME_WAIT状态,这个状态会持续2msl
为什么要等2ml?
当 TCP 毗连主动关闭方接收到被动关闭方发送的 FIN 和最终的 ACK 后,毗连的主动关闭方必须处于TIME_WAIT 状态并持续 2MSL 时间如许就可以大概让 TCP 毗连的主动关闭方在它发送的 ACK 丢失的环境下重新发送最终的 ACK。由于被断的一方如果充公到主动断一方的末了一个ACK的话,会再次发送一次FIN,这个时间就是留在这里用的。如果不等,一方结束了另一方没结束,那么就一直浪费资源
TCP的流量控制
滑动窗口是 TCP 中实现诸如 ACK 确认、流量控制、拥塞控制的承载布局
TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小意味着
接收方另有多大的缓冲区可以用于接收数据
。
发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据
。当滑动窗口为 0时,发送方一样平常不能再发送数据报
滑动窗口可以明白为缓冲区
这个滑动窗门主要是接收方来用的。
TCP通讯实例图:
win就代表接收方的滑动窗口另有多少空余可以继承的地方,如许发送方也能对应调整
TCP通讯并发
要点
使用多线程或者多历程的方式,实现多个客户端对服务器的访问操纵,每次一有客户端毗连,就创建新的历程或者线程
接纳资源,使用信号SIGCHILD+waitpid实现,在循环while(1)内部
当每次释放历程资源的时间,会使得创建新历程的while(1)里面的accept被信号软中断,这会导致这个的accept堕落,这个时间需要设置当errorno=ENTER的时间,再重新选换一次创建一个新的accept等候阻塞
多历程开发
遇到的问题,及解决
断开毗连后,服务器端怎样处置惩罚子历程,接纳资源?
使用信号处置惩罚
使用信号捕捉接纳子历程资源后,出现服务端accept: Interrupted system call,且不能有新客户端毗连,怎样解决?
产生EINTR信号,具体阐明通过man 2 accept检察
在accept返回值处进行判断处置惩罚,不输堕落误即可
当停止所有的客户端毗连后,出现read: Connection reset by peer,怎样解决?
产生的缘故原由:毗连断开后的读和写操纵引起的
简朴修改:将客户端中休眠语句的位置进行更改
方法:[261]Connection reset by peer的常见缘故原由及解决办法
解决上一个问题后,服务端出现两次client closed...,怎样解决?
是由于在关闭毗连后,应该退出循环,所以在该printf语句后,添加break即可
多线程开发
思路
服务端使用一个主线程,多个子线程
主线程负责等候并继承客户端的毗连
子线程:完成通讯,继承一个客户端毗连,就创建一个子历程用于通讯
客户端不需要改变(同一对一通讯)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
惊雷无声
论坛元老
这个人很懒什么都没写!
楼主热帖
记一次实战 Shiro反序列化内网上线 ...
基于 Sealos 的镜像构建能力,快速部署 ...
蚂蚁金服杨军:蚂蚁数据分析平台的演进 ...
超融合走向红海,下一代超融合是新蓝海 ...
Linux之iptables(NAT表)——实验篇 ...
联合评测 DapuStor Roealsen5 NVMe SSD ...
【学习笔记】WPF-02:XMAL基础 ...
1亿条数据批量插入 MySQL,哪种方式最 ...
学习TraceLogging事件,使用ETW记录, ...
Neo4j
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
程序人生
图数据库
快速回复
返回顶部
返回列表