乐趣区

关于linux:TCP-是如何建立连接的

TCP:SYN ACK FIN RST PSH URG 简析

三次握手 Three-way Handshake

Understanding TCP Connection with Examples
一个虚构连贯的建设是通过三次握手来实现的

  1. (B) –> [SYN] –> (A)

如果服务器 A 和客户机 B 通信. 当 A 要和 B 通信时,B 首先向 A 发一个 SYN (Synchronize) 标记的包,通知 A 申请建设连贯.

留神: 一个 SYN 包就是仅 SYN 标记设为 1 的 TCP 包(参见 TCP 包头 Resources). 意识到这点很重要,只有当 A 受到 B 发来的 SYN 包,才可建设连贯,除此之外别无他法。因而,如果你的防火墙抛弃所有的发往外网接口的 SYN 包,那么你将不 能让内部任何主机被动建设连贯。

  1. (B) <– [SYN/ACK] <–(A)

接着,A 收到后会发一个对 SYN 包的确认包 (SYN/ACK) 回去,示意对第一个 SYN 包的确认,并持续握手操作.

留神: SYN/ACK 包是仅 SYN 和 ACK 标记为 1 的包.

  1. (B) –> [ACK] –> (A)

B 收到 SYN/ACK 包,B 发一个确认包(ACK),告诉 A 连贯已建设。至此,三次握手实现,一个 TCP 连贯实现

Note: ACK 包就是仅 ACK 标记设为 1 的 TCP 包. 须要留神的是当三此握手实现、连贯建设当前,TCP 连贯的每个包都会设置 ACK 位

这就是为何连贯跟踪很重要的起因了. 没有连贯跟踪, 防火墙将无奈判断收到的 ACK 包是否属于一个曾经建设的连贯. 个别的包过滤 (Ipchains) 收到 ACK 包时, 会让它通过(这相对不是个 好主见). 而当状态型防火墙收到此种包时,它会先在连贯表中查找是否属于哪个已建连贯,否则抛弃该包

Understanding TCP Sequence Number with Examples

在 TCP 层,有个 FLAGS 字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.
其中,对于咱们日常的剖析有用的就是后面的五个字段。

它们的含意是:

URG:Urget pointer is valid (紧急指针字段值无效)

SYN: 示意建设连贯

FIN: 示意敞开连贯

ACK: 示意响应

PSH: 示意有 DATA 数据传输

RST: 示意连贯重置。

Understanding PSH ACK TCP Flags

其中,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 数据包内容被传递。

Flags 值阐明:

FIN: "finished" 简写。示意发送者以及发送完数据。通常用在发送者发送完数据的最初一个包中。SYN: "Synchronisation" 简写。示意三次握手建设连贯的第一步,在建设连贯时发送者发送的第一个包中设置 flag 值为 SYN。RST: "reset" 简写。重置连贯标记,用于重置因为主机解体或其余起因而呈现谬误的连贯。或者发送包发送到一个不是冀望的                  目标主机时,接收端发送 reset 重置连贯标记的包。PSH: "push" 简写。告诉接收端解决接管的报文,而不是将报文缓存到 buffer 中。ACK: "Acknowledgment" 简写。示意包曾经被胜利接管。URG: "urgent" 简写。告诉接收端解决在解决其余包前优先解决接管到的紧急报文(urgent packets)。详见 RFC6093。ECE: "ECN-Echo" 简写。ECN 示意 Explicit Congestion Notification。示意 TCP peer 有 ECN 能力。详见 RFC3168。CWR: "Congestion Window Reduced" 简写。发送者在接管到一个带有 ECE flag 包时,将会应用 CWR flag。详见 RFC3168。NS: "nonce sum" 简写。该标签用来爱护不受发送者发送的突发的歹意暗藏报文的侵害。详见 RFC 3540。

Understanding TCP Flags

各个 Field 阐明:

源端口(Source Port):长度为 16 bits(2 个字节)。源端口。
目标端口(Destination Port):长度为 16 bits(2 个字节)。目标端口。
序列号(Sequence Number):长度为 32 bits(4 个字节)。指定了以后数据分片中调配给第一字节数据的序列号。在 TCP 传输流中每一个字节为一个序号。如果 TCP 报文中 flags 标记位为 SYN,该序列号示意初始化序列号 (ISN),此时第一个数据应该是从序列号 ISN+ 1 开始。
确认序列号(Acknowledgment Number):长度为 32bits(4 个字节)。示意 TCP 发送者冀望承受下一个数据分片的序列号。该序号在 TCP 分片中 Flags 标记位为 ACK 时失效。序列号分片的方向和流的方向同方向,而确认序列号分片方向和流方向反方向.

Understanding TCP Socket With Examples

Exploring TCP Connection Time_Wait in Linux Netstat

退出移动版