tcp协议基础

发布时间 2023-09-30 16:43:29作者: 折翼的小鸟先生

前言:买的书到了,特此来学习一下。

内容参考《web漏洞解析与攻防实战》-----

1 tcp协议

之前有两篇基础的博客较为浅显的介绍了一下http协议,在http协议发挥作用之前,我们注意到

会先建立tcp连接,那tcp连接要如何建立呢?这就需要tcp协议了。

tcp协议是一种面向连接的,可靠的,基于字节流,双全工的传输层通信协议

建立一个tcp连接的过程需要三次握手,断开tcp连接的过程需要三次挥手,接下来我们较为详细的介绍一下

1.1 建立连接的三次握手

第一次握手时,客户端发送SYN请求到服务器,客户端在发送完进入SYN_SENT状态。

第二次握手,服务器端收到SYN包,确认客户信息后发送SYN ACK包给客户端,服务器端进入 SYN_RECV状态

第三次握手,客户端收到STN AKC 包 向服务器端发送ACK 包,客户端发出包后进入ESTABLISHED状态,服务器端收到包后,也进入

ESTABLISHED 状态。

就此,三次握手完毕,tcp连接成功建立,然后http协议开始发送数据,这就不多讲了。

图示

1.2 flags标志位

上面区分不同包的依据是Flags标志位,这又是什么呢?

Flags"通常指的是标志位或标志性的位,它们是在计算机编程和系统中广泛使用的概念。这些位用于表示某种状态或条件,以便程序可以

根据它们的值采取不同的行动。例如,一个标志位可以表示某个操作是否已经完成,另一个标志位可以表示错误是否发生。

在计算机编程中,标志位通常是一个二进制位(0或1),用于表示某种状态。程序可以检查这些标志位的值,并根据情况采取适当的行

动。标志位在条件语句、循环和控制流中经常用到,以便根据不同的条件执行不同的代码块。

在传统的TCP 约定中,flags标志位一共有6个,在rfc3168中增加了两个标志位,这九个标志位分别为``

NS CWR ECE URG ACK PSH RST SYN FIN

从右往左,代表了9个二进制位

每个标志位可以取0或者1,代表该类型是否被启用。

例如对SYN 请求,只有SYN位设置位1,其他位设置位0,整体就是0b000000010

0b 代表二进制,讲flags换算成十进制则为flags=2, 对于SYN ACK 请求,只有SYN位和ACK 设为1,其他都是0,换算成十进制则flags

16 。

1.3 tcp协议的四次挥手

我们通过三次握手建立了TCP 连接,当我们传输信息结束,如何断开连接呢?这时候就要用到四次挥手了。断开连接的请求可以由客户端

发起,也可也由服务器端发起,所以不用区分哪一端,用ab表示即可。

以下图为例,这是客户端想要断开连接

第一次挥手 客户端发送一个FIN ACK 包用来关闭客户端对服务器端的数据传送,客户端进入FIN_WAIT_1 状态

第二次挥手,服务器端收到包,发送一个ACK 包给客户端,然后服务器端进入CLOSE_WAIT 状态

第三次挥手,服务器端发送一个FIN_ACK 包,用来关闭服务器端对客户端的数据传送,服务器端发送完后进入LAST_ACK状态

第四次挥手,客户端收到服务器端的包,进入FIN_WAIT2 状态,接着发送一个ACK包,然后进入CLOSED状态,服务器端收到数据包后也

进入CLOSED状态,自此完成四次挥手过程。

示例

1.4 TCP协议的基本结

1 IP协议工作于网络层,封装了源IP和目标IP,TCP协议工作于第四次层传输层,他在IP 协议之上,不需要关心IP 结构,但需要约定端口

2 TCP 协议具有序列号,根据序列好可以防止请求被重复传递

3 TCP 建立连接的不同操作主要体现在flags标志位上