TCP建立连接的“三次握手”和TCP断开连接的“四次挥手”
TCP建立连接的“三次握手”
第一次握手:
客户端向服务器发送一个SYN(同步)包,其中包含客户端选择的初始序列号(用于后续的数据传输)。客户端进入SYN_SENT状态,等待服务器确认。
第二次握手:
服务器收到客户端的SYN包后,确认客户端的请求信息,并发送一个SYN ACK(同步和确认)包作为响应。服务器选择自己的初始序列号,并将客户端的初始序列号加1作为确认号。此时服务器进入SYN_RECV状态。
第三次握手:
客户端收到服务器的SYN ACK包后,发送一个确认ACK(确认)包作为响应。客户端将服务器的初始序列号加1作为确认号,并发送给服务器。一旦服务器收到这个ACK包,它就知道客户端已经接收到了服务器的确认。客户端和服务器都进入ESTABLISHED状态,表示连接已经成功建立。
通过这个三次握手过程,客户端和服务器都确认了彼此的收发能力,并同步了初始序列号,以便后续的可靠数据传输。这种握手过程可以确保连接的可靠性和一致性,使得双方都能够准备好进行数据传输。
TCP断开连接的“四次挥手”
由于断开连接时,可以由客户端发起,也可以由服务端发起,因此不区分哪一端,用A、B表示两端,A和B既可以是客户端也可以是服务端,当A是客户端时,B就是服务端,反之亦然。
第一次挥手:
第二次挥手:
B端收到A端的FIN ACK包后,发送一个ACK(确认)包给A端作为响应,表示B端已经收到了A端的关闭请求。B端进入CLOSE_WAIT状态。此时,B端可能还有数据要发送给A端。
第三次挥手:
B端发送一个FIN ACK包给A端,表示B端也希望断开连接,不再发送数据。B端进入LAST_ACK状态,等待A端确认。
第四次握手:
A端收到B端的FIN ACK包后,A端进入FIN_WAIT_2状态,发送一个ACK包给B端作为确认。B端收到ACK包后,进入CLOSED状态,表示连接已经断开。A端在发送完ACK包后也进入CLOSED状态。
通过这个四次挥手过程,A端和B端都发送了FIN ACK包和ACK包,确保双方都确认了对方的关闭请求,并完成了数据传输的结束。这种挥手过程允许双方在断开连接之前完成数据的传送和确认,保证了数据的可靠传输和完整性。
启动模拟站点
在Python中,您可以使用内置的http.server模块启动一个简单的HTTP服务器。以下是一个示例:
打开终端或命令提示符。
导航到您要在其中启动HTTP服务器的目录。
在终端或命令提示符中运行以下命令:
python -m http.server
默认情况下,该命令将在本地主机上启动一个简单的HTTP服务器,并绑定到端口8000。如果端口8000已被占用,它将尝试使用下一个可用的端口(例如8001、8002,依此类推)。
输出类似于以下内容:
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
这表示HTTP服务器已成功启动并正在监听指定的端口。
现在,您可以在浏览器中访问http://localhost:8000/来查看服务器的内容。默认情况下,它将显示当前目录中的文件列表。
WireShark抓包分析
使用全新浏览器打开网站http://127.0.0.1:8000/刷新一次后关闭浏览器停止抓包
在Wireshark中,您可以使用过滤器来筛选特定端口的网络流量。对于筛选8000端口的流量,可以使用以下过滤器表达式:
tcp.port == 8000
这个过滤器将仅显示在8000端口上进行的TCP流量。
以下是在Wireshark中应用过滤器的步骤:
打开Wireshark并开始捕获网络流量。
在过滤器字段中输入上述过滤器表达式:tcp.port == 8000。
按下Enter键或点击"Apply"按钮应用过滤器。
现在,只有与8000端口相关的TCP流量将被显示在Wireshark捕获结果中。
请注意,如果您的流量中还包含其他协议(如UDP),您可以使用tcp.port == 8000 || udp.port == 8000的过滤器来筛选8000端口上的TCP和UDP流量。
为了方便查看,我使用命令筛选
tcp.port == 50350
TCP建立连接的“三次握手”
TCP断开连接的“四次挥手”
传输层密码协议(TLCP)
传输层密码协议(Transport Layer Cryptographic Protocol,TLCP)是一种用于安全通信的握手协议。它通过交换消息来协商密码套件和生成主密钥,从而确保双方在传输层进行安全的通信。
握手协议涉及以下过程:
——交换hello消息来协商密码套件,交换随机数,决定是否会话重用。
——交换必要的参数,协商预主密钥
——交换证书或IBC信息,用于验证双方
——使用预主密钥和交换的随机数生成主密钥
——向记录层提供安全参数
——验证双方计算的安全参数的一致性、握手过程的真实性和完整性。
握手过程如下:
客户端发送客户端hello消息给服务端,服务端回应服务端hello消息,否则产生一个致命错误并断开连接。客户端hello和服务端hello用于在客户端和服务端进行基于SM2、RSA或IBC的密码算法协商,以及确定安全传输能力,包括协议版本、会话标识、密码套件等属性,并且产生和交换随机数。
在客户端hello和服务端hello消息之后是身份验证和密钥交换过程。包括服务端证书、服务端密钥交换,客户端证书、客户端密钥交换。
在服务端发送完hello消息之后,接着发送自己的证书消息,服务端密钥交换消息。如果服务端需要验证客户端的身份,则向客户端发送证书请求消息。然后发送服务端hello完成消息,表示hello消息阶段已经结束,服务端等待客户端的返回消息。如果服务端发送了一个证书请求消息,客户端应返回一个证书消息。然后客户端发送密钥交换消息,消息内容取决于客户端hello消息和服务端hello消息协商出的密钥交换算法。如果客户端发送了证书消息,那么也应发送一个带数字签名的证书验证消息供服务端验证客户端的身份。
接着客户端发送密钥规格变更消息,然后客户端立即使用刚协商的算法和密钥,加密并发送握手结束消息。至此握手过程结束,服务端和客户端可以开始数据安全传输。
总体上,握手过程通过交换hello消息、证书、密钥交换消息等来协商安全参数,验证双方身份,最终生成用于保障数据传输的主密钥,从而确保传输层的安全性。
如果客户端和服务端决定重用之前的会话,它们可以避免重新协商安全参数,从而加快握手过程。这被称为会话重用。
客户端发送客户端hello消息,并在消息中包含要重用的会话标识。
如果服务端有匹配的会话存在,服务端将使用相应的会话状态接受连接,并回复一个具有相同会话标识的服务端hello消息。
然后客户端和服务端各自发送密码规格变更消息和握手结束消息,确保安全参数的一致性。
最后,客户端和服务端发送握手结束消息,握手过程结束,服务端和客户端可以开始数据的安全传输。
如果服务端没有匹配的会话标识,说明这是一个新的连接,服务端会生成一个新的会话标识,并进行一个完整的握手过程,包括协商安全参数等步骤。
会话重用的好处是可以减少握手时间和资源消耗,因为双方不需要重新进行完整的握手协商过程,而是可以直接使用之前建立的会话状态。这对于频繁的客户端-服务端通信场景可以提供更好的性能。然而,为了安全起见,在使用会话重用时,双方必须仔细处理会话状态的管理,确保其安全性,避免会话信息泄漏或被恶意利用。
密码套件列表
密钥交换算法与证书密钥类型关系表
流量分析
阅读 10万+