TCP三次握手,四次挥手;多历程、多线程实现并发服务器 ...

打印 上一主题 下一主题

主题 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 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表