TCP通信过程三次握手、TCP通信四次挥手

本文详细介绍了TCP通信的特性,包括三次握手和四次挥手的过程。在三次握手中,客户端首先发送SYN报文,服务器回复SYN+ACK并请求连接,客户端再发送确认包,双方进入ESTABLISHED状态。四次挥手时,主动方发送FIN报文,被动方确认并可能发送剩余数据,然后发送FIN报文,主动方最后确认,确保连接关闭。

TCP通信过程三次握手、TCP通信四次挥手

一、TCP通信特点:点对点的连接,保证数据准确性,内容时序无误;

二、TCP三次握手

在这里插入图片描述

1、握手前服务器必须处于listen 状态;

2、第一个握手包由客户端发往服务器端,此包为请求包,发完后客户端处于SYN_SEND 状态;

(第一次握手 :客户端向服务器端发送SYN报文(seq=x,SYN=1;),字节进入SYN_SEND状态,等待服务器确认。)

3、服务器收到客户端第一个握手包后,发送第二个握手包,此包既为确认包也是请求包,发送完成后服务器处于SYN_RCVD状态;

第二次握手:分两部分,即SYN+ACK(请求和确认)报文:
①服务器收到了客户端的请求,向客户端回复一个确认信息(ACK+1);
②服务器再向客户端发送一个SYN包(seq=y),建立连接的请求,此时服务器进入SYN_RECV状态;

4、客户端收到服务器回包后,确认数据正常后发送第三个握手包,此包为确认包,发送完成后客户端处于ESTABLISHED状态;

第三次握手:客户端收到服务器的回复(SYN+ACK报文),客户端向服务器发送确认包(ACK),此包发送完毕,客户端和服务器端都进入ESTABLISHED 状态,完成三次握手。

5、服务器收到最后一个确认包后确认数据数据无误后状态变更为 ESTABLISHED;

注意:三次握手的目的是确认服务器端、客户端的收发数据包功能正常。seq表示请求序列号,ACK 表示确认序列号,SYN 和ACK 为标志位。

三、TCP四次挥手

在挥手过程中,请求断开的可以是服务器也可以是客户端,但往往都是客户端主动断开连接的。

在这里插入图片描述

1.第一次挥手:主动方数据传输完毕需要断开连接,向TCP 发出连接释放报文(FIN=1,seq=y),同时进入FIN_WAIT_1状态,等待被动方确认;

2.第二次挥手:被动方收到连接释放报文,立即发出确认报文(ACK=1,确认号:ack=y+1),并且进入CLOSE_WAIT状态,主动方收到确认报文后之后若有之前的数据未发送完,此时发送,发送完后进入FIN_WAIT_2状态,等待被动方发出连接释放报文;

3.第三次挥手:在第二次挥手中,被动方发出确认报文后,继续发送之前未发送的数据,在数据发送完成后,被动方发出连接释放报文(FIN=1,ACK=1,序列号seq=z),随后被动方进入LAST_ACK状态,等待主动方最后确认;

4.第四次挥手:主动方在收到被动方的连接释放报文后,对此发出确认报文段(ACK=1,ack=z+1),主动端进入TIME_WAIT 状态,被动端收到主动端的确认报文后,立即进入CLOSE状态,主动方,在等待两个最大报文生存时间后进入CLOSE状态。(原因:①保证主动端发送的最后一个ACK 报文能够到达被动端;②防止已经失效的连接请求报文段出现在本连接中)。

### Nginx 在 SSL/TLS 握手过程中调用的 OpenSSL 接口 Nginx 是一个广泛使用的高性能 Web 服务器,它通过集成 OpenSSL 库来实现 SSL/TLS 协议,从而支持 HTTPS 服务。在 SSL/TLS 握手过程中,Nginx 调用了 OpenSSL 提供的一系列关键接口来完成密钥协商、身份认证和建立安全通道等操作。 在握手开始阶段,Nginx 使用 `SSL_CTX_new` 创建 SSL 上下文,用于配置 SSL/TLS 协议版本、加载证书和私钥等。该上下文对象在整个连接生命周期中被复用,以提高性能。随后,调用 `SSL_new` 创建一个独立的 SSL 连接实例,该实例与客户端的 TCP 连接绑定。 当客户端发起连接请求时,Nginx 会调用 `SSL_accept` 来处理服务器端的握手流程。此函数负责接收客户端的 ClientHello 消息,发送 ServerHello、证书、ServerKeyExchange(如需要)等消息,并完成密钥交换和身份验证。在证书验证过程中,OpenSSL 内部会使用 `X509_verify_cert` 函数来验证客户端或服务器证书的有效性。 在握手过程中,Nginx 会调用 `SSL_set_fd` 或 `SSL_set_bio` 将 SSL 实例与底层的 socket 文件描述符或 BIO 对象绑定,以便进行数据的读写操作。握手完成后,数据通信将通过 `SSL_read` 和 `SSL_write` 接口进行加密和解密传输。 对于证书验证和 Finished 消息的处理,OpenSSL 会根据协议版本(SSLv3 或 TLS)分别计算 MD5 和 SHA-1 的散列值,以确保握手消息的完整性[^3]。这一过程涉及 `ssl3_finish_mac` 和 `tls1_finish_mac` 等内部函数的调用。 此外,Nginx 支持 SNI(Server Name Indication)扩展,通过 `SSL_CTX_set_tlsext_servername_callback` 设置回调函数,根据客户端请求的域名动态选择不同的证书,从而实现多域名 HTTPS 支持。 为了防止 SSL/TLS 握手过程中出现异常导致连接失败,Nginx 会结合 `SSL_get_error` 和 `SSL_read`/`SSL_write` 的返回值判断当前连接状态,并进行相应的错误处理。例如,当出现 `SSL_ERROR_WANT_READ` 或 `SSL_ERROR_WANT_WRITE` 时,Nginx 会暂停当前连接的处理,等待 I/O 事件再次触发。 Nginx 中的 SSL/TLS 握手流程大致如下: ```c SSL_CTX *ctx = SSL_CTX_new(TLS_method()); SSL *ssl = SSL_new(ctx); SSL_set_fd(ssl, client_fd); int ret = SSL_accept(ssl); if (ret <= 0) { int err = SSL_get_error(ssl, ret); // handle error } ``` Nginx 通过调用 OpenSSL 提供的这些接口,实现了完整的 SSL/TLS 握手流程,并结合自身事件驱动模型优化了 HTTPS 服务的性能。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jun8086

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值