网络基础二——TCP可靠性实现机制补充2

这篇具有很好参考价值的文章主要介绍了网络基础二——TCP可靠性实现机制补充2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

验证客户端和服务端三次握手和四次挥手时的状态

三次握手

#include <sys/types.h>        
#include <sys/socket.h>
int listen(int sockfd, int backlog);
netstat ntp
//查看连接的状态

​ 将TCP服务端套接字设置为listen状态之后,此时服务端是处于LISTEN状态的;服务端没有使用accept接口时,在收到客户端的连接请求时双方会经历3次握手,最终都处于ESTABLISHED状态;即连接的建立和accept没有关系,三次握手是双方操作系统自动完成的

​ 当listen的第二个参数设为一时,能建立全连接的连接数是2;操作系统会将没有被上层accept的连接管理起来,对它们先描述再组织,并且以队列的方式管理这些连接结构;三次握手时每次形成的连接本质上就是创建一个连接结构体对象并将其链入到队列当中,而accept就是从队列中将连接取走和特定的文件关联起来,返回特定的文件描述符;listen的第二个参数+1表示已经建立好的连接队列的最大长度,这个队列叫做全连接队列;accept和连接入队还有全连接队列构成了CP模型;服务端三次握手完成或者建立连接成功就将连接入队列,如果队列满了就无法入队列了,就会将连接状态设置为SYN_RECV状态,换句话说就是因为全连接队列满了,服务端将客户端发送过来的第三次握手应答报文直接丢弃了;

​ 如果服务端长时间无法得到应答就会释放掉SYN_RECV状态的连接,这种连接叫做半连接;半连接也需要进行管理,所以也会存在半连接队列,节点并不会长时间维持;

​ 这样就出现了客户端和服务器连接不一致的问题;服务端直接将应答丢弃,但是确实是收到了应答,所以第二次握手是可靠的,知道客户端建立连接成功了,并不会发送RST标志位;对于客户端建立连接成功了,但是发送数据不成功,就转而继续开始进行三次握手;

​ 大量建立半连接会导致真正地SYN洪水;服务器资源有限制不会挂掉,但是其他客户端就无法正常的访问了;

​ 全连接队列长度不可以太长,因为上层处理繁忙时,就无法保证将全连接队列获取完,而队列长度过长就会导致资源闲置,维护还要有成本,而且变相地减少了上层空间,降低了处理的效率;而队列的存在可以保证,半连接变成全连接和全连接被上层处理可以并发运行;所以一般全连接队列的长度一般要设置为10左右;

四次挥手

​ 当客户端关闭连接时,服务端的连接会处于CLOSE_WAIT状态,由于服务端不关闭连接,会维持此状态维持一段时间,直到关闭连接时,才会将此状态改为LAST_ACK,收到应答后关闭连接;

​ 主动关闭连接的一方最终会先处于TIME_WAIT状态(连接没有完全断开),一般维持60-120s的时长,这时候就不可以重新绑定端口号,因为连接没有完全断开意味着IP和端口号还在被使用,并且一个端口号只能绑定一个进程,所以重启服务会失败,得等待60-120s;对于一个服务器不可以立即重启会产生很大的损失,所以需要修改此状态,进行地址复用;

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname,
               void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,
               const void *optval, socklen_t optlen);//将TIME_WAIT的IP和端口号复用;
//第一个参数是要被修改属性的套接字,第二个参数一般是SOL_SOCKET表示在套接字层,第三个参数表示操作名字,如:复用IP和端口号,第四个参数表示将选项设置为有效;
int opt = 1;
setsockopt(listensockfd_, SOL_SOCKET, SO_REUSEADDR|SO_REUSEPORT, &opt, sizeof(opt));
//这样就可以重新建立好连接了

​ 客户端能够立即重连是因为使用的是系统分配的随机端口号,所以重连时的端口号与上一次不一样,就不会出现绑定失败的情况;

​ MSL:数据报在网络中最多存活的时长;

​ TCP协议规定,主动关闭连接的一方要处于TIME_ WAIT状态,等待两个MSL(maximum segment lifetime)的时间后才能回到CLOSED状态;MSL在RFC1122中规定为两分钟,但是各操作系统的实现不同, 在Centos7上默认配置的值是60s;可以通过 cat /proc/sys/net/ipv4/tcp_fin_timeout 查看msl的值;

​ 1.TIME_WAIT等待两个MSL时间是因为要让历史数据在网络中消散(否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的);序号一般是随机的,防止黑客的恶意攻击和历史保温的影响;

​ 2.让断开连接四次挥手具有较好的容错性;

最大存在时长不等于最大传送时长;还包括了异常的路由阻塞时间;一般TIME_WAIT时长为60-120秒;如果没有accept可能就会没有TIME_WAIT状态,直接关闭;

11.3.7流量控制

​ 流量控制不仅保证了可靠性,而且提高了效率;捎带应答也是保证可靠性并且提高效率;

​ 流量控制,发送方通过接收到接收方发送过来的报头(16位窗口大小)知道接收方接收缓冲区剩余空间的大小,进而调整发送速度;

​ 对于第一次发送数据报文时,也要保证发送的数据量是合理的;因为正式通信交换数据之前,要通过进行三次握手来可靠的建立连接,这期间是发送了报文的,通信双发都可以得知对方接收缓冲区的剩余空间大小,也可以携带16位窗口大小;

​ 第三次握手的时候其实是可以携带数据的,即可以是携带应答;

​ 当接收方的接收缓冲区写满了,发送发继续发送报文会产生丢包,为了大规模的减少这种问题,就需要进行流量控制;1.发送方会定期的向接收方发送窗口探测(仅仅是一个报头,不携带数据,所以丢失不会产生大影响),当发送方收到窗口探测应答,则说明有空间了或者接收端返回了上次数据报文的应答也可以说明有空间了;2.接收方会主动发送窗口更新消息(也是一种报头);

​ 以上两种方式一起使用选择最优的,一定程度上提高了效率,而且两种方式提高了容错性;

​ 如果两种方式是执行了一定次数后还没有成功就会认为网络异常并且关闭连接;

​ TCP窗口大小(接收缓冲区的大小)默认最大就是65535字节,但是可以配合TCP首部40字节的选项窗口扩大因子M使用,实际的窗口大小就是窗口字段的值左移M位,这还与操作系统实际提供多大的缓冲区有关;

11.3.8滑动窗口

​ 如果串行的发送数据报文加确认应答,确实可以保证可靠性,但是效率太低;所以除了控制使用串行的方式,常规都是使用并行的方式发送一批数据报文后才接受一批确认应答;没有收到应答就会使用超时重传机制;

​ 为了保证数据的可靠性需要在设置的特殊时间间隔里将大量的发送数据报文管理起来;这些数据报文本来就存在于发送缓冲区,没必要专门再拷贝一份的方式维护,只需要将发送缓冲区进行划分即可;

​ 可以简单地划分为三部分从左往右依次为已发送已确认区域,已发送未确认区域,待发送区域;对于已发送已确认的区域是可以被覆盖的;已发送未确认区域可以继续发送数据,即支持发送一批数据,如果没有收到应答就继续维护此数据,如果收到了应答就将此数据移动到已发送已确认区域,表示此数据已经被清理掉;已发送未确认区域就叫做滑动窗口

​ 滑动窗口是发送缓冲区的一部分;

​ 滑动窗口的数据是可以直接发送给接收方的,这样就可以一次性发送一批数据报文,等到接收到应答时,在将数据移动到另一个区域,不再维护;如果没有收到应答,就可以进行补发;

​ 滑动窗口的大小默认是接收方的16位窗口大小,但是还需要考虑到网络的情况;

​ 对于发送缓冲区区域的划分可以使用双指针的方式(数组下标)如:win_start,win_end,来划分成三个区域;维护发送缓冲区其实就是修改这些特殊下标缓冲区;

​ 收到确认就是应答就是将start右移,如果接收方的接收缓冲区变大了,就将end右移使得滑动窗口变大;这样的过程就像是在滑动;换句话说滑动的本质就是指针的右移;

​ 网络是不支持发送大块数据的,只能分段发送;文章来源地址https://www.toymoban.com/news/detail-855960.html

到了这里,关于网络基础二——TCP可靠性实现机制补充2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机网络】TCP原理 | 可靠性机制分析(一)

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程、计算机网络的一点学习心得,欢迎大家在评论区交流讨论💌 无连接:知道对端的IP和端口号就可以直接进行传

    2024年02月03日
    浏览(26)
  • 【计算机网络】TCP原理 | 可靠性机制分析(四)

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】 本专栏旨在分享学习计算机网络的一点学习心得,欢迎大家在评论区交流讨论💌 接收方在接收到数据后并不立即发送ACK报文,而是等待一定的延迟时间,

    2024年01月16日
    浏览(23)
  • 确定性网络技术怎样实现网络的可靠性?

    确定性网络技术通过采用特定的协议、机制和策略,有助于提高网络的可靠性。本文通过一些关键的方面,来说明确定性网络技术如何实现这一目标。 时钟同步机制是确定性网络中的核心角色。为了实现高度可靠的通信,需要采用先进的时钟同步技术,例如像IEEE 1588 和 802

    2024年01月21日
    浏览(32)
  • 【网络原理进阶篇】自定义协议,协议约定符,三次握手,四次挥手,TCP(保证可靠性机制)和UDP原理

    前言: 大家好,我是 良辰丫 ,我们已经学习了网络原理基础版,初步认识了网络,还学习了网络编程,了解了网络通信的各种程序,接下来我们更深入的了解网络是如何工作的.这篇文章我们主要介绍协议,UDP和TCP的一些原理.💞💞 🧑个人主页:良辰针不戳 📖所属专栏:javaEE初阶 🍎

    2023年04月24日
    浏览(71)
  • TCP如何保证传输可靠性?

    文章参考: 《网络是怎样连接的》:https://book.douban.com/subject/26941639/ 《图解网络》:https://www.xiaolincoding.com/network/ 在开始阅读该博客之前,先要好好了解一下 TCP报文头部 到底有那些信息,阅读后续内容时有任何模糊的地方都可以回来这里 查看梳理 ,接下来我来解释一下:

    2024年02月20日
    浏览(31)
  • TCP消息传输可靠性保证

    三次握手 TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。 所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。 第一次握手:客

    2024年02月12日
    浏览(23)
  • TCP如何保证服务的可靠性

    TCP保证可靠性一般有以下几种方法: (1) 确认应答 :ACK和序列号 (2) 超时重传 :发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送 (3) 流量控制 :控制发送方发送窗口的大小来实现流量控制 (4) 拥

    2024年02月15日
    浏览(27)
  • TCP如何保证传输的可靠性

    TCP采用哪些方式保证数据传输可靠? 答: 1、数据分块:将数据包划分为合适的大小,这样更能适应网络的限制,如果数据发生错误或丢失,只要重传有问题的部分即可,减少重传的数据量。方便进行流量和拥塞控制。 2、数据包有序号,可以根据序号对失序的数据包进行重

    2024年04月11日
    浏览(27)
  • 从可靠性的角度理解 tcp

    可靠性是 tcp 最大的特点。常见的用户层协议,比如 http, ftp, ssh, telnet 均是使用的 tcp 协议。可靠性,即从用户的角度来看是可靠的,只要用户调用系统调用返回成功之后,tcp 协议栈保证将报文发送到对端。引起不可靠的表现主要有两个方面,丢包和乱序。对于 tcp 来说,即使

    2024年02月20日
    浏览(28)
  • 【HBZ分享】TCP可靠性传输如何保证的?

    ACK机制是发送方与接收方的一个相互确认 客户端向服务端发送连接请求,此时服务端要回馈给客户端ACK,以表示服务端接到了客户端请求,这是第一和的第二次握手 客户端接收到服务端响应后,同样也要回馈服务端的响应,告知服务端我收到了你的回馈,我们可以进行传输

    2024年02月10日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包