TCP协议详解

TCP协议详解
TCP协议
数据包头
源端⼝:占16位,也就是说最⼤端⼝数65535个
⽬标端⼝:占16位,也就是说最⼤端⼝数65535个
序列号:seq序号,占32位,⽤来表⽰从tcp源端像⽬标端发送的字节流,发起⽅发送数据时对此进⾏
标识。
确认号:ack序号,占32位,只有ACK标识位为1时,确认序号字段才有效。节能玻璃贴膜
数据偏移:占4位,表⽰数据开始的地⽅离TCP段的起始处有多远。实际上就是TCP段⾸部的长度。由于⾸部长度不固定,因此数据偏移字段是必要的。
标识位:共6个,即URG、ACK、PSH、RST、SYN、FIN,具体含义如下:
URG:紧急位,为1时,紧急指针(urgent pointer)有效,表⽰数据需要优先处理。紧急指针指出在TCP段中的紧急数据的最后⼀个字节的序号,使接收⽅可以知道紧急数据共有多长。
ACK:确认位,为1时,确认序号有效。
PSH:推位,为1时,接收⽅应该尽快将这个报⽂交给应⽤层。
RST:复位标志,为1时,复位连接,⼀般在出错或关闭连接时使⽤。
SYN:同步位,在建⽴连接时使⽤,当SYN=1⽽ACK=0时,表明这是⼀个连接请求报⽂段。对⽅若同意建⽴连接,在发回的报⽂段中使SYN=1和ACK=1。
FIN:结束位,为1时,表⽰发送⽅完成了数据发送。
窗⼝:占16位,表⽰报⽂段发送⽅期望接收的字节数,可接收的序号范围是从接收⽅的确认号开始到确认号加上窗⼝⼤⼩之间的数据。
谷氨酰胺合成酶检验和:占16位,包含了伪⾸部、TCP⾸部和数据,校验和是TCP强制要求的,由发送⽅计算,接收⽅验证。
紧急指针:URG标志为1时,紧急指针有效,表⽰数据需要优先处理。紧急指针指出在TCP段中的紧急数据的最后⼀个字节的序号,使接收⽅可以知道紧急数据共有多长。
选项:最常⽤的选项是最⼤段⼤⼩(Maximum Segment Size,MSS),向对⽅通知本机可以接收的最⼤TCP段长度。MSS选项只在建⽴连接的请求中发送。
TCP三次握⼿和四次挥⼿
设计理念:
1、Seq(相当于request),Ack(相当于response),当Ack的值等于Seq的值加⼀(2的32次⽅,理论上重复的概率极⼩),确⽴⼀对request-response。
2、建⽴连接、断开连接通过标识位来判断包的作⽤。从⽽改变C-S的状态,实现通讯。
三次握⼿
第⼀次握⼿:Client访问Server,数据包头的标识位SYN=1(连接标识),seq序号为J(client建⽴连接的请求)。Client发完包以后,状态变成SYN_SENT,Server端接受到包后,状态从LISTEN变成SYN_RCVD。轴流风机启动
第⼆次握⼿:Server发起⼀个回应包,数据包头的标识位SYN=1,ACK=1,seq=K(server建⽴连接的请求),ack=J+1(server回复client连接可以建⽴)。Client收到ack=J+1确认是⾃⼰发包的回应包,⽴即将状态改成ESTABLISHED状态。
第三次握⼿:Client到Server的连接已经建⽴,因为TCP是全双⼯通讯协议,所以还需要建⽴Server端到Client端的连接。第⼆次握⼿中,Server端已经将连接建⽴的请求发给Client端了,所以第三次需要再发⼀个包给Server端。数据包头的标识位
ACK=1,ack=K+1(client回复server连接可以建⽴)。收到包后Server端⽴即将状态改成ESTABLISHED状态。
四次挥⼿
第⼀次挥⼿:哪边发起断开,哪边为Client端。Client端先发包,标识位FIN=1(断开标识),Seq=m。发完包后Clinet端⽴即变成
环视制作者FIN_WAIT_1状态,Server端收到包后状态变成CLOSE_WAIT。
第⼆次挥⼿:Server端响应Client端,发起⼀个回应包,标识位ACK=1(确认),Ack=m+1。Clinet收到包后,状态变为FIN_WAIT_2。
第三次挥⼿:同时Server端也需要断开连接,也需要发起⼀个断开包,标识位FIN=1(断开标识),Ack=m+1,Seq=n。Server发完包后状态变成LAST_ACK,Client收到包后状态变为TIME_WAIT(防⽌数据包丢失,默认120s秒,超时以后状态变成CLOSED)
第四次挥⼿:Client端响应Server端,发起⼀个回应包,标识位ACK=1(确认),Ack=n+1。Clinet收到包后,状态变为CLOSED。
TCP11种状态(copy)
简单解释:
CLOSED:初始状态,表⽰TCP连接是“关闭着的”或“未打开的”。
LISTEN :表⽰服务器端的某个SOCKET处于监听状态,可以接受客户端的连接。
SYN_RCVD :表⽰服务器接收到了来⾃客户端请求连接的SYN报⽂。在正常情况下,这个状态是服务器端的SOCKET在建⽴TCP连接时的三次握⼿会话过程中的⼀个中间状态,很短暂,基本上⽤netstat很难看到这种状态,除⾮故意写⼀个监测程序,将三次TCP握⼿过程中最后⼀个ACK报⽂不予发送。当TCP连接处于此状态时,再收到客户端的ACK报⽂,它就会进⼊到ESTABLISHED 状态。
钼精粉SYN_SENT :这个状态与SYN_RCVD 状态相呼应,当客户端SOCKET执⾏connect()进⾏连接时,它⾸先发送SYN报⽂,然后随即进⼊到SYN_SENT 状态,并等待服务端的发送三次握⼿中的第2个报⽂。SYN_SENT 状态表⽰客户端已发送SYN报⽂。
ESTABLISHED :表⽰TCP连接已经成功建⽴。
FIN_WAIT_1 :这个状态得好好解释⼀下,其实FIN_WAIT_1 和FIN_WAIT_2 两种状态的真正含义都是表⽰等待对⽅的FIN报⽂。⽽这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对⽅发送了FIN报⽂,此时该SOCKET进⼊到FIN_WA
IT_1 状态。⽽当对⽅回应ACK报⽂后,则进⼊到FIN_WAIT_2 状态。当然在实际的正常情况下,⽆论对⽅处于任何种情况下,都应该马上回应ACK报⽂,所以FIN_WAIT_1 状态⼀般是⽐较难见到的,⽽FIN_WAIT_2 状态有时仍可以⽤netstat看到。
FIN_WAIT_2 :上⾯已经解释了这种状态的由来,实际上FIN_WAIT_2状态下的SOCKET表⽰半连接,即有⼀⽅调⽤close()主动要求关闭连接。注意:FIN_WAIT_2 是没有超时的(不像TIME_WAIT 状态),这种状态下如果对⽅不关闭(不配合完成4次挥⼿过程),那这个 FIN_WAIT_2 状态将⼀直保持到系统重启,越来越多的FIN_WAIT_2 状态会导致内核crash。
TIME_WAIT :表⽰收到了对⽅的FIN报⽂,并发送出了ACK报⽂。 TIME_WAIT状态下的TCP连接会等待2*MSL(Max Segment Lifetime,最⼤分段⽣存期,指⼀个TCP报⽂在Internet上的最长⽣存时间。每个具体的TCP协议实现都必须选择⼀个确定的MSL 值,RFC 1122建议是2分钟,但BSD传统实现采⽤了30秒,Linux可以cat /proc/sys/net/ipv4/tcp_fin_timeout看到本机的这个值),然后即可回到CLOSED 可⽤状态了。如果FIN_WAIT_1状态下,收到了对⽅同时带FIN标志和ACK标志的报⽂时,可以直接进⼊到TIME_WAIT状态,⽽⽆须经过FIN_WAIT_2状态。(这种情况应该就是四次挥⼿变成三次挥⼿的那种情况)
CLOSING :这种状态在实际情况中应该很少见,属于⼀种⽐较罕见的例外状态。正常情况下,当⼀
⽅发送FIN报⽂后,按理来说是应该先收到(或同时收到)对⽅的ACK报⽂,再收到对⽅的FIN报⽂。但是CLOSING 状态表⽰⼀⽅发送FIN报⽂后,并没有收到对⽅的ACK报⽂,反⽽却也收到了对⽅的FIN报⽂。什么情况下会出现此种情况呢?那就是当双⽅⼏乎在同时close()⼀个SOCKET的话,就出现了双⽅同时发送FIN报⽂的情况,这是就会出现CLOSING 状态,表⽰双⽅都正在关闭SOCKET连接。
CLOSE_WAIT :表⽰正在等待关闭。怎么理解呢?当对⽅close()⼀个SOCKET后发送FIN报⽂给⾃⼰,你的系统毫⽆疑问地将会回应⼀个ACK报⽂给对⽅,此时TCP连接则进⼊到CLOSE_WAIT状态。接下来呢,你需要检查⾃⼰是否还有数据要发送给对⽅,如果没有的话,那你也就可以close()这个SOCKET并发送FIN报⽂给对⽅,即关闭⾃⼰到对⽅这个⽅向的连接。有数据的话则看程序的策略,继续发送或丢弃。简单地说,当你处于CLOSE_WAIT 状态下,需要完成的事情是等待你去关闭连接。
平板显示LAST_ACK :当被动关闭的⼀⽅在发送FIN报⽂后,等待对⽅的ACK报⽂的时候,就处于LAST_ACK 状态。当收到对⽅的ACK报⽂后,也就可以进⼊到CLOSED 可⽤状态了。
CLOSING状态:
参考

本文发布于:2024-09-22 00:58:31,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/108548.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:状态   连接   数据   发送   接收
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议