tcp协议基础
前言:买的书到了,特此来学习一下。
内容参考《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标志位上