热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么我的modbustcpserver只能连一个client_TCP协议概览

文章说明,视频分享喜欢cLinux后台服务器开发的朋友可以后台私信【架构】获取图中视频背景知识——互联网分层模型应用层(DNS,FTP,H

文章说明,视频分享 喜欢c++ Linux后台服务器开发的朋友可以后台私信【架构】获取图中视频

1a6f0c275792b40301471a9dc23822a5.png

背景知识——互联网分层模型

  1. 应用层(DNS,FTP,HTTP,RTSP,SSH,TLS/SSL, XMPP, DHCP...)
  2. 传输层(TCP,UDP...)
  3. 网络层(IP,...)
  4. 链路层(ARP,...)
  5. 实体层

另外,也有将互联网分为7层的说法,他们分别是:应用层、
表示层(提供数据格式或转换服务。比如:加密与解迷,编码与解码,压缩与解压)、
会话层(为客户端的应用程序提供了打开、关闭和管理会话的机制)、
传输层、网络层、数据链路层、物理层。

TCP 是什么?

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流(byte stream)的传输层通信协议;
TCP 基于不可靠的 IP 协议,提供稳定、可靠的数据传输服务;
对于 TCP 需要知道的是,TCP 所处的第2层传输的数据叫 Segment,IP 所处的第3层传输的叫 Datagram, 第4层传输的数据则叫做 Frame;
数据从应用层往下传输,每经过一层都会在数据头部被加上一个 header ,层层封装;
反之,则需要层层解封,最后应用层才能取得数据。

TCP 特性

  1. 点对点协议
  2. 可靠
  3. 管道传输(同时送多个segments)
  4. sender & receiver 都有 buffer
  5. byte stream
  6. 双向传输
  7. 面向连接(oriented connection)
  8. 重传机制

TCP segment 结构体(这个非常重要)

e03ffcece38340a83dbd82811c2cd2bd.png

tcp-segment.png

  • source port:源 Application 端口号
  • dest port:目标 Application 端口号

TCP 三次握手(如何建立连接?)

  1. Client 传送一个 SYN segment 给 Server(init sequence number)
  2. Server 收到 SYN,回一个 SYNACK segment 给 Client(alloc buffer; init sequence number)
  3. Client 收到 SYNACK,再回一个ACK,从此连接才算是建立完成(同时,可以带上 data 做数据传输)

TCP 为什么需要三次握手?

49160a6ed26b94a5fb03931f2b79d8b1.png

TCP 四次分手(如何关闭连接?)

  1. client 传送一个 FIN segment 给 server,请求关闭连接
  2. server 回一个 ack 给 client,表示 client 可以关闭连接了
  3. server 再发一个 FIN segment 给 client,请求关闭连接
  4. client 回一个 ack 给 server,表示 server 可以关闭连接,server 收到 ack ,关闭连接。此时,client 等待2MSL后依然没有收到回复,则证明 server 端已正常关闭,那好,client 也可以关闭连接了。
7e066946f20ada5ff68ccdb2b2cd382b.png

tcp_close.png

TCP 为什么需要四次分手?

简单来说,因为 TCP 连接是双向的,所以 sender 需要发送 FIN 征求 server 的同意;随后,server 收到 client 的请求,给 client 回复 ack,告诉它,此时可以关闭连接;而 server 同时也需要通知 client ,告诉它自己不会再传输数据了,所以,server 给 client 发送 FIN 信号;最后,client 收到 server 的请求, 回复 ack 表示同意。

TCP 如何保证数据传输是可靠的?

  1. 给 byte stream 编号
  2. receiver 校验数据的正确性
  3. receiver 回复 ack
  4. timer. 发生 timeout 时,重传

TCP 重传机制

为什么会重传?
1. 丢失 ack
Host A 给 Host B 传输 数据, 随后 Host B 给 A 回复 ack, 但由于网络原因,这个 ack 在传输过程中 loss 了, 那么经过一个 timeout 时间后,Host A 给 Host B 重新传送这份数据。
2. timeout
Host A 给 Host B 传输数据, 随后 Host B 给 A 回复 ack ,但由于网络延迟,这个 ack 在一个 timeout 时间内没有被及时送给 Host A,经过一个 timeout 时间后,重送数据,并且在收到延时的 ack 后, 按实际收到的数据回复 ack
3. 收到3次重复的 ack
由于 receiver 回复给 sender 的 ack 序列号表示期望下次 sender 送过来的数据的序列号,所以当 sender 收到 3次重复的 ack(也就是 ack 序列号都一样),这个时候就会重新发送丢包或者延迟的 packet

快速重传:在发生 timeout 之前重传数据。

TCP Nagle Algorithm & Delay Ack

以上两种策略都是针对TCP 频繁传送小包的情况,

  1. Nagle Algorithm: 发送一个小包后,如果这个小包还没有被 ack ,则后面等待发送的少量数据,会进入 buffer 缓冲区,
    这部分数据在等待时间到了后才会被统一发送出去。
  2. Delay Ack: receiver 收到的数据如果不是按顺序送进来的,则会先不发 ack ,等一定顺序的数据都到了后,统一发 ack, 尽量减少 ack 的次数。
    根据他们的处理机制可以知道,这两种策略都是牺牲时效性来提升性能。遇到时效性高的应用场景,可以自行关闭。


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 流数据流和IO流的使用及应用
    本文介绍了流数据流和IO流的基本概念和用法,包括输入流、输出流、字节流、字符流、缓冲区等。同时还介绍了异常处理和常用的流类,如FileReader、FileWriter、FileInputStream、FileOutputStream、OutputStreamWriter、InputStreamReader、BufferedReader、BufferedWriter等。此外,还介绍了系统流和标准流的使用。 ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • 计算机网络计算机网络分层结构
    为了解决计算机网络复杂的问题,提出了计算机网络分层结构。计算机网络分层结构主要有OSI7层参考模型,TCPIP4层参考模型两种。为什么要分层不同产商 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • STM32 IO口模拟串口通讯
    转自:http:ziye334.blog.163.comblogstatic224306191201452833850647前阵子,调项目时需要用到低波 ... [详细]
  • IP双栈环境下网络应用迁移
    IPv4向IPv6迁移有多种途径,在选择具体的迁移方式时,当前环境中运行的应用是否支持IPv6是重要的考量因素之一,同时在编写新的应用时,需要考虑新编写的应用不仅可以适应当前主流的IPv4环境, ... [详细]
  • Azkaban(三)Azkaban的使用
    界面介绍首页有四个菜单projects:最重要的部分,创建一个工程,所有flows将在工程中运行。scheduling:显示定时任务executing:显示当前运行的任务histo ... [详细]
  • FILETYPE*filetype.txt*ForVimversion6.4.文件类型*filetype**file-type*1.文件类型|filetypes|2.文件类型插 ... [详细]
author-avatar
小辛牛牛123牛牛小辛321
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有