TCP包和握手规则
位码即tcp标志位,有6种标示:SYN(synchronous建立联机) 、ACK(acknowledgement 确认)、 PSH(push传送)、 FIN(finish结束)、RST(reset重置)、URG(urgent紧急)、Sequence number(顺序号码) 、Acknowledge number(确认号码)。
三次握手
- B ----> 【SYN】----> A
B需要跟A建立连接时,首先向A发送一个SYN (Synchronize) 标记的包,告诉A请求建立连接。
注意:一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources).认识到这点很重要,只有当A受到B发来的SYN包,才可建立连接,除此之外别无他法。 - A ---->【SYN/ACK】----> B
A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作。
注意:SYN/ACK包是仅SYN 和 ACK 标记为1的包。 - B ----> 【ACK】----> A
B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立.至此三次握手完成,建立连接。
注意:ACK包就是仅ACK 标记设为1的TCP包。需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位。
四次挥手
- B ----> 【ACK/FIN】----> A
- A ----> 【ACK】----> B
- A ----> 【ACK/FIN】----> B
- B ----> 【ACK】----> A
注意:由于TCP连接是双向连接, 因此关闭连接需要在两个方向上做。ACK/FIN 包(ACK 和FIN标记设为1)通常被认为是FIN(终结)包.然而, 由于连接还没有关闭, FIN包总是打上ACK标记.没有ACK标记而仅有FIN标记的包不是合法的包,并且通常被认为是恶意的。
RST包
四次挥手不是关闭TCP连接的唯一方法。有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST(Reset)包将被发送。 注意在,由于RST包不是TCP连接中的必须部分,可以只发送RST包(即不带ACK标记)。但在正常的TCP连接中RST包可以带ACK确认标记。
PSH包
当设置为1时,要求把数据尽快的交给应用层,不做处理。
URG包
设置为1时,首部中的紧急指针有效;为0时,紧急指针没有意义。
通常的数据中都会带有PSH但URG只在紧急数据的时设置,也称“带外数据”,解释如下:
紧急数据:URG标志设置为1时,紧急指针才有效,紧急方式是向对方发送紧急数据的一种方式,表示数据要优先处理。他是一个正的偏移量,与TCP收不中序号字段的值相加表示紧急数据后面的字节,即紧急指针是指向紧急数据最后一个字节的下一个字节。这是协议编写上的错误,RFC1122中对此给出了更正说明,紧急指针是数据最后一个字节,不是最后字节的下一位置,TCP首部中只有紧急指针指出紧急数据的位置,他所指的字节为紧急数据,但没有办法指定紧急数据的长度。
URG=1,表示紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指向字节就是紧急数据)不进入缓冲区(一般不都是待发送的数据要先进入发送缓存吗?就直接交个上层进程,余下的数据都是要进入接收缓冲的;一般来说TCP是要等到整个缓存都填满了后在向上交付,但是如果PSH=1的话,就不用等到整个缓存都填满,直接交付,但是这里的交付仍然是从缓冲区交付的,URG是不要经过缓冲区的

浙公网安备 33010602011771号