双手把双手教你双手撸通讯协议(三)-开始双手撕TCP
发布时间:2025年09月02日 12:17
(5)催促侧接获FIN链路后,"就想到可以停止使用联接了,但是他还是不相信在线,恐怕维修服务侧不想到要停止使用,所以唯送ACK后转入TIME_WAIT平衡状态,如果维修服务侧不曾有接获ACK则可以CDR。
(6)维修服务侧接获ACK后,"就想到可以拉出联接了"。
MSL后直到现在不曾有接获回复,则断言维修服务侧已短时间停止使用,那好,催促侧也可以停止使用联接了。
这七个解决办法可以很清晰的看见为啥要同步进行四次挥手,表明TCP拉出。
第三节
TCP的平衡状态切换
从上述三次击掌确立联送信四次挥手拉出联接过程里面,回事可以阐述到两张标明:催促侧平衡状态连动标明和维修服务侧平衡状态连动标明。
这两个标明结合起来就是TCP的平衡状态切换标明了,(标明来自详解)。
第四节
TCP操纵块解释
上面主要让大家对TCP这个协商有理论上的引介,接下去我们要同步进行一些引码解释。
struct tcp_pcb{ IP_PCB; //这是一个宏,描绘出了联接的 IP特别数据,包内括僵持IP地址,TTL等数据 struct tcp_pcb *next; //运用于联接各个TCP操纵块的链表变量 enum tcp_state state; //TCP 联接的平衡状态,即为平衡状态标明里面描绘出的那些平衡状态 u8_t prio; //该操纵块的优不须级 void* callback_arg;// u16_t local_port; //本地侧口 u16_t remote_port; //远程侧口 u8_t flags;// 附另加平衡状态数据,如联接是另加速速恢复、一个被提早的 ACK 是不是被唯送等 #define TF_ACK_DELAY (u8_t)0x01U /提早唯送 ACK(拖延表明) #define TF_ACK_NOW (u8_t)0x02U /赶紧唯送 ACK #define TF_INFR ((u8_t)0x04U) //联接保持稳定另加速CDR平衡状态 #define TF_TIMESTAMP ((u8_t)0x08U) //联接的时间段戳选项已使能 #define TF_FIN ((u8_t)0x20U) //该软件已停止使用该联接 #define TF_NODELAY ((u8_t)0x40U) //禁止 Nagle 插差值 #define TF_NAGLEMEMerr ((u8_t)0x80U) //本地缓冲器区溢出 // 发送到特别数组 u32_t rcv_nxt; //盼望发送到的下一个个字符,即它向唯送侧 ACK 的编号 u16_t rcv_wnd; //发送到站内 u16_t rcv_ann_wnd; //公告站内较小 u32_t tmr; // 该数组历史记录该 PCB 被建立的时刻 u8_t polltmr, pollinterval; // 三个定时器,早不须谈解 u16_t rtime; //CDR定时,该差值随时间段增另加,当大于 rto 的差值时则CDR唯生 u16_t mss; //较大样本段较小 //RTT 估计值特别的表达式 u32_t rttest; //估计值赢取的 500ms 滴答数 u32_t rtseq; //运用于试验里面 RTT 的包内的编号 s16_t sa, sv; //RTT 估计值出的千分之及其时间段差 u16_t rto; // 重唯延时时间段,为了让之前面的几个差值算出 u8_t nrtx; // 重唯的数目,该数组在样本包内多次延时时被可用到,与新设 rto 的差值特别 // 另加速速CDR/恢复特别的表达式 u32_t lastack; // 较大的表明编号,该数组不解 u8_t dupacks; // 上面这个编号被CDR的数目 // 漏出操纵特别表达式 u16_t cwnd; //联接的也就是说漏出站内 u16_t ssthresh; // 慢启动阈差值 // 唯送特别数组 u32_t snd_nxt, // 下一个将要唯送的个字符编号 snd_max, // 略低于的唯送个字符编号 snd_wnd, // 唯送站内 snd_wl1, snd_wl2, // 都只站内改版时的样本编号和表明编号 snd_lbb; // 唯送表头里面再一一个个字符的编号 u16_t acked; // u16_t snd_buf; // 一般来说的唯送缓冲器个字符数 u8_t snd_queuelen; // 一般来说的唯送包内数 struct tcp_seg *unsent; // 唯送的样本段表头 struct tcp_seg *unacked; // 唯送了不曾接获表明的样本表头 struct tcp_seg *ooseq; // 接接获基因组以外的样本包内表头 #if LWIP_CALLBACK_API // 回调给定 err_t (* sent)(void *arg, struct tcp_pcb *pcb, u16_t space)? //当样本被最终唯送后被给定调用 err_t (* recv)(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)? //接接获样本后被给定调用 err_t (* connected)(void *arg, struct tcp_pcb *pcb, err_t err)? //联接确立后被给定调用 err_t (* poll)(void *arg, struct tcp_pcb *pcb)? //该给定被文件系统震荡给定调用 void (* errf)(void *arg, err_t err)? //联接唯生错误时给定调用 #endif /* LWIP_CALLBACK_API */ u32_t keep_idle; #if LWIP_TCP_KEEPALIVE u32_t keep_intvl; // 保活定时器,运用于检测空闲联接的另一侧是不是瓦解 u32_t keep_cnt; //坚定不移定时器计数差值 #endif /* LWIP_TCP_KEEPALIVE */ u32_t persist_cnt; // 这两个数组可以使站内较小数据维持不断流动 u8_t persist_backoff;//坚定不移定时器探查链路唯送的比例 u8_t keep_cnt_sent; //保活链路唯送的数目};(这个基础插差值在很多插差值很新颖);在这里主要运用于除此以外和操纵。这里偷偷地wnd结尾数组都与斜面站内插差值特别的表达式。如果有不忽略这个插差值的恰巧可以好好去了解下,早不须社会活动里面很不太可能经常见到。
如上标明标明:联接的僵持都维持一个站内运用于样本的唯送。斜面站内把整个基因组拆成三部分:左边的是唯送了并且被表明的一组,站内右边是还不曾唯送的一组,站内实质上是待表明的一组,站内实质上又拆成早已唯送待表明的,和不曾唯送但将赶紧唯送。TCP是通过正面表明和CDR核心技术来保证有用性的,斜面站内可以使唯送方在接获之前一个一组的表明数据之前唯送下一个一组。
有了唯送站内,自然还有一个发送到站内维护,如下标明标明:在发送到方,rev_wnd声称了自己发送到站内的较小,它可以在给唯送方的ACK包内里面公告自己的站内较小差值,唯送方接接获该差值后,就意在设子自己的唯送站内较小差值snd_wnd。唯送方的唯送站内内包内的样本唯送基因组是与ACK编号密切特别的,即它将ACK编号以后的snd_wnd个个字符编号包内括在站内内。唯送方的 acked 数组就声称早已接接获的略低于的ACK编号,snd_nxt声称唯送方即将唯送样本的编号,acked与snd_nxt之间的样本声称早已被唯送但还接接获ACK,唯送方也必须将他们包内括在斜面窗内,以便利延时重唯,snd_nxt到唯送站内侧声称还唯送的样本。
在LWIP里面解决问题的给定段为:
客户侧:
if ((flags Max TCP_SYN) || (flags Max TCP_FIN)) { //唯送SYN或FIN包内被显然样本间距为1 ++len;} pcb->snd_lbb += len; /// //下一个要被缓冲器样本的编号,提醒与snd_nxt不尽相同 //所以,tcp_enqueue给定再一,snd_lbb差值替换成ZSL2,其他数组差值不变。 //tcp_connect给定几周还给定调用tcp_output将样本包内唯送上去, //后者唯送一个具体的样本段是通过给定调用给定tcp_output_segment解决问题的, //这个给定主要是混和待唯送样本段的TCP头部里面的表明编号为rcv_nxt的差值为0 //公告站内较小为rcv_ann_wnd的差值TCP_WND //再一,tcp_output通过下面的字符来改版站内特别的数组: /// pcb->snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); // 下一个要唯送的个字符编号 if (TCP_SEQ_LT(pcb->snd_max, pcb->snd_nxt)) { pcb->snd_max = pcb->snd_nxt; // 较大唯送编号}维修服务侧:
if ((flags Max TCP_SYN) || (flags Max TCP_FIN)) { //唯送SYN或FIN包内被显然样本间距为1 ++len;} pcb->snd_lbb += len; /// // 下一个要被缓冲器样本的编号,提醒与snd_nxt不尽相同 // 所以tcp_enqueue给定再一,snd_lbb差值替换成ZSL1+1,其他数组差值不变。 // 几周给定调用tcp_output将样本包内唯送上去 // 与客户侧值得注意,混和待唯送样本段的TCP头部里面的表明编号为rcv_nxt的差值ZSL2, // 公告站内较小为rcv_ann_wnd的差值TCP_WND ///再一,tcp_output还要改版站内特别的数组: /// pcb->snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); // 下一个要唯送的个字符编号 if (TCP_SEQ_LT(pcb->snd_max, pcb->snd_nxt)) { pcb->snd_max = pcb->snd_nxt; // 较大唯送编号}今天不须谈到这边;下一章主要谈解TCP协商是怎么确立,TCP平衡状态是怎么切换的引码。早不须还但会谈解常见协商、modbus等
。脚扭伤了吃什么药好用什么生发效果最好
适合膝盖关节疼痛做的健身操
鼻塞的原因
抗生素
急支糖浆的功效和作用
眼屎多是什么原因
腹肌痛
上一篇: 必和必拓公司通过投资者卡班加镍矿重返非洲
下一篇: 震惊!种啥也不长?因为除草剂有毒太大?
- 数源科技(000909):实施关联贷款
- 下雪啦!南阳骨科医生给你一份最实用的防挥指南
- 徒步狂人谢建光:35年拉板车徒步30万公里,59岁终客死妻女
- 数源科技(000909):批准后公司提供关联担保额度
- 西安2地调为低风险 现有1个一般而言、3个中风险地区
- 黄芪和它想到“搭档”,经常泡水喝,补气养肾,血管或许变通畅
- 银宝山新(002786):2021年度利润分配按计划
- 浙富控股(002266):公司及所属合资公司向银行申请授信额度及担保事项
- 喝水正常,但总是“半夜尿频多”是怎么回事?或许与3个原因有关
- 科华生物(002022):2021年度利润分配预案,每10股派推测金红利0.65元(含税)
- 糖尿病是“躺在”出来的?躺在前若有3个迹象,血糖可能悄悄“飙升”
- 黑芝麻(000716):2021大奖利润分配预案
- 它是“天然黄体酮”,女人经常吃,通乳散结,乳房或许越来越肥胖症
- 科华生物(002022):2022年度向银行申请综合授信额度和向母公司提供担保