TCP的几种状态: (SYN, FIN, ACK, PSH, RST, URG)

在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.

其中,对于我们日常的分析有用的就是前面的五个字段。 它们的含义是:SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有 DATA数据传输,RST表示连接重置。

其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是建立连接。TCP的几次握手就是通过这样的ACK表现出来的。但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。

PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。 TCP的连接建立和连接关闭,都是通过请求-响应的模式完成的。

TCP三次握手: TCP(Transmission Control Protocol)传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)

三次握手详解如下: 一个虚拟连接的建立是通过三次握手来实现的

  1. (B) –> [SYN] –> (A) 假如服务器A和客户机B通讯. 当A要和B通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接. 注意: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources). 认识到这点很重要,只有当A受到B发来的SYN包,才可建立连接,除此之外别无他法。因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不能让外部任何主机主动建立连接。
  2. (B) <– [SYN/ACK] <–(A) 接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作. 注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.
  3. (B) –> [ACK] –> (A) B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。至此,三次握手完成,一个TCP连接完成 Note: ACK包就是仅ACK 标记设为1的TCP包. 需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位 握手阶段: 序号 方向 seq ack 1  A->B 10000 0 2 B->A 20000 10000+1=10001 3 A->B 10001 20000+1=20001 解释: 1:A向B发起连接请求,以一个随机数初始化A的seq,这里假设为10000,此时ACK=0 2:B收到A的连接请求后,也以一个随机数初始化B的seq,这里假设为20000,意思是:你的请求我已收到,我这方的数据流就从这个数开始。B的ACK是A的seq加1,即10000+1=10001 3:A收到B的回复后,它的seq是它的上个请求的seq加1,即10000+1=10001,意思也是:你的回复我收到了,我这方的数据流就从这个数开始。A此时的ACK是B的seq加1,即20000+1=20001 数据传输阶段: 序号  方向      seq ack size 23 A->B 40000 70000 1514 24 B->A 70000 40000+1514-54=41460 54 25 A->B 41460 70000+54-54=70000 1514 26 B->A 70000 41460+1514-54=42920 54 解释: 23:B接收到A发来的seq=40000,ack=70000,size=1514的数据包 24:于是B向A也发一个数据包,告诉B,你的上个包我收到了。B的seq就以它收到的数据包的ACK填充,ACK是它收到的数据包的SEQ加上数据包的大小(不包括以太网协议头,IP头,TCP头),以证实B发过来的数据全收到了。 25:A在收到B发过来的ack为41460的数据包时,一看到41460,正好是它的上个数据包的seq加上包的大小,就明白,上次发送的数据包已安全到达。于是它再发一个数据包给B。这个正在发送的数据包的seq也以它收到的数据包的ACK填充,ACK就以它收到的数据包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是头长,没数据项)。 其实在握手和结束时确认号应该是对方序列号加1,传输数据时则是对方序列号加上对方携带应用层数据的长度.如果从以太网包返回来计算所加的长度,就嫌走弯路了. 另外,如果对方没有数据过来,则自己的确认号不变,序列号为上次的序列号加上本次应用层数据发送长度.

转载于:https://my.oschina.net/u/727148/blog/280183

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP (Transmission Control Protocol) 是一种面向连接的可靠的传输协议,其的标志位主要有 SYNFINACK 等。下面分别介绍这些标志位的作用和置 1 的情况: 1. SYN (Synchronize Sequence Number) 标志位:用于建立 TCP 连接时的同步序列号。当发送方想要建立一个 TCP 连接时,它会向接收方发送一个带有 SYN 标志位的数据包,接收方收到该数据包后会回复一个带有 SYNACK 标志位的数据包,表示可以建立连接。在建立连接时,SYN 标志位被置为 1。 2. FIN (Finish) 标志位:用于关闭 TCP 连接。当一方想要关闭 TCP 连接时,它会向对方发送一个带有 FIN 标志位的数据包,表示该方已经没有数据要发送了。接收方收到该数据包后,会发送一个带有 ACK 标志位的数据包,表示已经收到了这个 FIN 数据包。当接收方也没有数据需要发送时,会发送一个带有 FIN 标志位的数据包,表示它也要关闭连接。在关闭连接时,FIN 标志位被置为 1。 3. ACK (Acknowledgement) 标志位:用于确认收到数据。当一方收到数据后,需要向另一方发送一个带有 ACK 标志位的数据包,表示已经收到了数据。在 TCP 连接建立后的数据传输,每一个数据包都需要带有 ACK 标志位,用于确认收到数据。在确认收到数据时,ACK 标志位被置为 1。 需要注意的是,在实际的 TCP 数据传输,这些标志位可能会被组合使用,如 SYN+ACKFIN+ACK 等。此外,在 TCP 还有一些其他的标志位,如 RST (Reset)、URG (Urgent)、PSH (Push) 等,它们各自有不同的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值