首页 > 其他分享 >从1写TCPIP协议栈7:TCPIP协议!!!!!

从1写TCPIP协议栈7:TCPIP协议!!!!!

时间:2023-04-05 23:00:11浏览次数:38  
标签:协议 窗口 ACK TCP 发送 滑动 TCPIP

前言

  本次课程练习的重点来啦!!TCP(Transmission Control Protrol)协议,存在于传输层,面向字节流、带有确认与累计的滑动窗口协议。TCP可以是说IP子协议中最基础的、最完备的前辈协议,它首次实现了差错修正,弥补了IP协议与UDP协议的缺点。、

TCP协议简介(初步)

滑动窗口

 

  1、我们假设一条链路中有且仅有一个分组/一个数据包进行传输,那如何确定这个分组有没有到达呢?我们需要添加ACK进行接收成功的确认即可。

  2、那如果我们要保证两个分组之间有序传输呢?我们需要给ACK添加一个累计的属性(即ACK为确认成功的包序列号+1 = 下一次想要接收的包序列号)。

  3、在1、2的基础上我们已经可以实现一个有序的、可靠的数据包传输了。可是这样效率太低了,那我们如果一次性发很多包呢?这样就会产生很多问题?这些包的有序性在发送时如何保证?这些包发送的速率比接收的速率快怎莫办?其实这些我们都可以总结为一个问题点:“我们到底要在多长时间内注入多少包?”

  4、由此诞生了滑动窗口协议,即事先布置好发送的数个包装在一个窗口里上,每次发车都会把窗口上所有的数据包全部发送完然后慢慢等待每个包的ACK确认,如果某个包没有收到确认,发送方将进行重传。如果最先发送的包收到了ACK,这个窗口便有空间继续装下一个包,此为滑动。

  总之,分组滑动窗口解决了:

  • 数据不可靠的问题:通过维护发送方和接收方缓冲区,解决网络之间数据不可靠的问题,例如丢包、重复包、出错、乱序等。

  • 次序问题:通过滑动窗口协议,发送方和接收方可以按次序传输数据,从而保证数据次序正确。

  • 吞吐量问题:通过滑动窗口协议可以提高吞吐量。在传统的停止等待协议中,每发送一个包都需要等待对方的确认包,这样就会造成很大的延迟和低吞吐量。而在滑动窗口协议中,发送方可以连续发送多个数据包,并且不需要等待对方的确认,从而提高了数据传输的效率。

拥塞控制

  拥塞控制一般有速率的流量控制,比如根据环境的上线计算一个发送速率的上限值。另一种是基于窗口大小的流量控制,比如通过限定窗口的大小来限定一次性发送包的数量,窗口大则发的多,窗口小则发得少。会过来继续上面的内容,基本的滑动窗口协议已经帮助我们解决了数据的有序可靠传输,一定程度上也提高了传输效率。但是还有一个亟待解决?滑动协议的窗口具体应该多大?大了的话会不会导致延时?小的话比如1会不会导致失去作用?既然我都要,那就设计为动态的吧。具体动态如何变化我们后文继续说。

TCP头部

TCP头部仍然是跟在IP头部之后,TCP头部和IP头部一样一般都是20字节:

 

  • 源端口、目标端口:与IP协议中的IP源/目标IP地址进行绑定以对应唯一确定的应用进程,这一绑定关系称之为Sokcet。
  • 序列号:用来保证包次序的正确性,起始值0-2^32中间的随机值。
  • 确认号:期望接收的下一个序列号,只有在ACK位生效的前提下才有用。
  • 头部长度:TCP头部长度,以dword为单位。
  • CWR:拥塞窗口减少。
  • ECE:拥塞通知,发送方接受了一个拥塞通知。
  • URG:表示紧急指针字段有效,很少使用。
  • ACK:确认。
  • PSH:推送标志,接收方应该尽快给应用程序传输这个数据。
  • RST:重置链接,通常是发生错误的错误时候置位。
  • SYN:同步位,握手的期间置位。
  • FIN:结束数据传输标志,在分手的期间置位。
  • 窗口大小:控制滑动协议窗口的大小以实现拥塞控制。
  • 校验和:同UDP一样是伪intel校验和,因此每跳依次需要重新计算依次校验和。

TCP协议状态机

 

  图中的红色路径标注的是客户端的状态转换路径,也就是主动发起方。在完整的TCP协议开发时,我们需要给每一个线程(Socket)都要准备两种状态转换机制,也就是要求我们开发的协议栈既能作为服务器,也能作为客户端。因为是整车中ECU往往请求其他ECU的同时而被另外的ECU请求者,既是服务器又是客户端。而我们本次开发的工程代替的是服务器,因此实际上只需要考虑四个状态“Established”、“Closewait”、“Last ACK”、“Closed”之间的状态即可。这里需要强调一个参数就是2MSL(maximum segment lifetime),设置这个参数的主要原因是为了保证FIN重传,说大话就是要保证TCP链接的可靠性和完整性,还有另外一种作用就是为了确保此Sokcet不可被重复使用,否则将产生资源耗尽的情况。若是上层应用做了相关校验,也会抛出对应异常。

三次握手

四次分手

TCP接口定义

TCP_initial

用于初始化TCP协议栈参数。

TCP_input

用于处理TCP的输入包。

TCP_reset

用于重置TCP的链接。

TCP_open

随机挑选一个未使用的sokcet进行链接建立。

TCP_bind

用于Socket/IP-Port的绑定

TCP_listen

用于TCP链接请求的监听及回复。

TCP_close

用于关闭TCP链接。

TCP_find

用于查询TCP socket。

TCP_read_mss

读取选项字段的MSS,用于限制握手链接中的数据包长度。

标签:协议,窗口,ACK,TCP,发送,滑动,TCPIP
From: https://www.cnblogs.com/YiMo9929/p/17224075.html

相关文章

  • ZooKeeper数据和集群特点,ZAB协议和选主过程解析
    前言本文讲述ZooKeeper集群架构特点、数据结构、事务ID、选主和ZAB协议具体执行过程。服务保证ZooKeeper非常快速且非常简单。由于它的目标是构建更复杂的服务(如同步)的基础,因此它提供了一组保证:【顺序一致性】来自客户端的更新将按发送顺序执行,因为只有唯一的主节点负责写......
  • Raft协议及伪码解析
    跟着Martin大神学习Raft协议,带上讲解和伪码确实给人深入浅出的感觉,英音听起来十分优雅,也是一种享受了~视频地址:DistributedSystems6.2:Raft整篇主要包括了十张Slide:节点的状态转换首先需要明确,节点只有三种状态:followercandidateleaderfollower当一个节点刚启动的......
  • Modbus协议
    概念Modbus属于应用层协议,主要用于设备之间的网络通信存储区、存储区代号、范围制定不同的存储区的目的是存储不同类型的数据存储区:输入布尔(布尔也叫线圈)输出布尔输入寄存器输出寄存器存储区代号:输入布尔:1区输出布尔:0区输入寄存器:3区输出寄存器:4区存储区范围:......
  • 7·1HTTP协议的瓶颈|7·2双工通信的WebScoket|7·3探索式的实践-SPDY|7·4期盼已久的H
    HTTP协议的瓶颈影响Http网络请求的原因带宽延迟HTTP协议的瓶颈一条连接上只可发送一个请求请求只能从客户端开始。客户端不可以接受除响应意外的指令请求/响应头部不经压缩就发送每次互相发送相同的头部造成的浪......
  • 警惕职场的竞业协议坑
    阅读本文大概需要2.6分钟。最近,后台有好几个读者问我关于竞业协议的问题,大概类似于:张哥,新入职了一家公司,但是入职的时候签合同额外要签一份所谓的竞业协议,职场小白不懂这个,该不该签?张哥,最近环境不好,好不容易跳槽换了一份工作,但是离职的时候有被提到竞业协议一事,担心自己跳槽的公......
  • 武汉群硕软件实习协议
    雷文同学:非常高兴能邀请你的加入,希望在未来的一段时间里,你能在群硕度过一段充实而愉快的实习生活!实习期间,群硕将按照如下条款与你达成实习期的约定。谢谢!实习协议甲方:Augmentum,Inc.——武汉群硕软件开发有限公司乙方:雷文(身份证号码:)甲乙双方就甲方接收乙方作为实习员工一事,达......
  • 6·2HTTPS协议概述|6·32HTTPS使用成本|6·42HTTPS对性能的影响|6·52HTTPS常见问题
    HTTPS可以认为是HTTPS+TLSTLS是传输层加密协议,它的前身是SSL协议HTTPS功能介绍 内容加密 非对称密钥交换 对称内容加密 身份认证 数字证书 数据完整性 HTTPS使用成本 证书费用以及更新维护 HT......
  • #yyds干货盘点#【愚公系列】2023年04月 .NET CORE工具案例-使用MailKit使用POP3协议进
    前言1.MailKit简介MailKit是最流行且最强大的.NET邮件处理框架之一,下面为大家简单介绍MailKit的使用方式(IMAP为例)2.MailKit功能安全SASL身份验证支持CRAM-MD5、DIGEST-MD5、LOGIN、NTLM、OAUTHBEARER、PLAIN、SCRAM-SHA-1、SCRAM-SHA-256、SCRAM-SHA-512和XOAUTH2......
  • 从浏览器输入 url 到显示出结果的全过程,涉及哪些层哪些协议?
    过程中涉及的协议及层:1.当在浏览器输入URL地址,DNS域名解析协议(应用层协议)解析域名获得IP;2.依据IP地址浏览器向服务器发送HTTP请求,使用TCP协议(传输层协议)与服务器建立连接;3.连接建立时要发送数据,发送数据在网络层使用IP协议(网络层协议);4.期间IP数据包在路由器间路由选择使用......
  • HTTP缓存协议实战
    一、什么是缓存缓存,又称作Cache,我们把临时存储数据的地方叫做缓存池,缓存池里面放的数据就叫做缓存。当用户需要使用这些数据,首先在缓存中寻找,如果找到了则直接使用。如果找不到,则再去其他数据源中查找。二、为什么要使用缓存技术缓存的本质就是用空间换时间,以临时存储的数据暂时代......