博客
关于我
如何回答TCP三次握手和四次挥手(附赠大量面试题)
阅读量:547 次
发布时间:2019-03-07

本文共 2225 字,大约阅读时间需要 7 分钟。

TCP协议是传输层的核心协议之一,其设计目标是确保数据传输的可靠性和高效性。本文将从以下几个方面深入探讨TCP协议的工作原理和相关知识。

01 TCP基本认识

TCP协议作为传输层的可靠数据传输协议,是面向连接的、可靠的、基于字节流的通信协议。它与UDP的主要区别在于TCP提供的可靠性保证,确保数据包的无损传输。TCP的连接性使其适用于需要准确控制的数据传输场景。

TCP连接的三个关键特征:

  • 可靠性:TCP通过确认应答机制,确保每个数据包都可靠传输到目标终结点。
  • 流量控制:通过滑动窗口机制,TCP能够动态调整数据传输速率,避免网络拥塞。
  • 面向连接:TCP通信始终建立在一对一的连接基础上,每次连接独立进行数据传输。
  • 02 TCP连接建立

    TCP连接的建立需要经过三次握手过程,确保双方Ordinal Sequence Numbers(OSN)能够同步。此外,三次握手还避免了历史连接的重复,保证了资源的高效利用。

    三次握手原理

  • 客户端发送SYN报文:客户端随机生成初始序列号SYN,将SYNC标志位设置为1,并发送SYN报文给服务器,进入SYN-SENT状态。
  • 服务器处理SYN报文:服务器在收到SYN报文后,生成自己的初始序列号SYN,并发送SYN+ACK报文确认收到客户端的SYN,同时进入SYN-RCVD状态。
  • 客户端发送ACK报文:客户端接收到SYN+ACK报文后,回传ACK报文,进入ESTABLISHED状态,完成连接建立。
  • 03 TCP连接状态

    TCP连接的状态机是连接的生命周期的直接体现。除了建立连接的SYN相关状态,TCP还定义了多个状态用于描述连接的各个阶段。

    常见状态说明

    • CLOSED:连接已正常关闭,双方资源释放。
    • LISTEN:服务端正在监听,等待客户端连接请求。
    • SYN-SENT:客户端正在发送SYN报文,等待服务器响应。
    • SYN-RCVD:服务器正在等待客户端的ACK确认。
    • ESTABLISHED:连接已建立,双方可以进行数据传输。
    • FIN-WAIT-1:一方发送FIN报文,等待对端ACK确认。
    • FIN-WAIT-2:对端已发送ACK,等待发送FIN报文。
    • LAST-ACK:等待对端发送ACK报文,完成连接关闭。
    • CLOSE-WAIT:等待对端处理完应回复,关闭连接。
    • TIME-WAIT:主动关闭连接的一方进入该状态,等待2MSL时间。

    04 TCP连接断开

    TCP连接的断开是通过四次握手完成的。每次握手都需要双方确认,最终确保连接的双向断开。

    四次握手过程

  • 发送方发送FIN报文:选择性地关闭一方向的数据传输,发出FIN报文,进入FIN-WAIT-1状态。
  • 接收方发送ACK报文:确认接收到FIN报文,进入CLOSE-WAIT状态。
  • 接收方发送FIN报文:表明对_end也将关闭反向数据传输,进入LAST-ACK状态。
  • 发送方发送ACK报文:确认接收到对端的FIN报文,进入TIME-WAIT状态。
  • 05 TIME-WAIT状态与网络稳定性

    TIME-WAIT状态是TCP连接断开后的一种特殊状态,其主要作用是防止旧报文的干扰以及保证连接的正确性。

    TIME-WAIT的存在意义

    • 防止旧连接数据包的混淆:TIME-WAIT等待时间足够长,以确保可能的旧报文已过时,不再被误解为新的连接请求。
    • 确保连接的正确关闭:确保最后一个ACK报文已成功传输,对方处理完成。

    06 TCP连接的资源占用与优化

    TCP连接的资源占用直接关系到系统的性能和稳定性。通过合理设置内核参数,可以有效控制TIME-WAIT状态的数量。

    常见优化方法

  • 设置TCP参数:如net.ipv4.tcp_max_tw_bucketsnet.ipv4.tcp_tw_reuse,控制TIME-WAIT的数量和资源占用。
  • 启用保活机制:通过net.ipv4.tcp_keepalive_time设置保活时间,定期发送探测报文,避免死连接占用端口资源。
  • 应用SO_LINGER选项:设置socket的linger参数,控制socket关闭时的行为。
  • 07 Socket编程

    在实际应用中,socket编程是实现TCP协议通信的核心环节。服务端和客户端的socket初始化、连接建立和数据传输需要遵循特定的流程和规范。

    核心流程说明

  • 服务端
    • bind:将socket绑定目标IP地址和端口。
    • listen:设置监听队列大小,等待客户端连接。
    • accept:接收客户端的连接请求,返回新的socket文件描述符。
  • 客户端
    • socket:创建socket文件描述符。
    • connect:指定目标IP地址和端口,建立连接。
    • read/write:进行数据传输。
    • close:断开连接。
  • 08 listen参数的意义

    listen函数的第二个参数backlog表示已完成连接队列的大小,其实际值受内核参数somaxconn限制。

    参数影响

    • backlog:直接影响已完成连接队列的大小,过小可能导致排队时间过长。
    • somaxconn:限制单一主机最多可建立的TCP连接数,默认值为32768,但可根据实际需求调整。

    09 总结

    TCP协议作为传输层的核心协议,通过三次握手建立连接、可靠的数据传输机制和四次握手断开连接,为应用层提供了可靠且高效的通信服务。在实际应用中,合理配置TCP参数、理解状态机操作,都是优化系统性能和稳定性的重要途径。

    转载地址:http://tmncz.baihongyu.com/

    你可能感兴趣的文章
    MVC 区域功能
    查看>>
    MySQL FEDERATED 提示
    查看>>
    mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
    查看>>
    Mysql group by
    查看>>
    MySQL I 有福啦,窗口函数大大提高了取数的效率!
    查看>>
    mysql id自动增长 初始值 Mysql重置auto_increment初始值
    查看>>
    MySQL in 太多过慢的 3 种解决方案
    查看>>
    MySQL InnoDB 三大文件日志,看完秒懂
    查看>>
    Mysql InnoDB 数据更新导致锁表
    查看>>
    Mysql Innodb 锁机制
    查看>>
    MySQL InnoDB中意向锁的作用及原理探
    查看>>
    MySQL InnoDB事务隔离级别与锁机制深入解析
    查看>>
    Mysql InnoDB存储引擎 —— 数据页
    查看>>
    Mysql InnoDB存储引擎中的checkpoint技术
    查看>>
    Mysql InnoDB存储引擎中缓冲池Buffer Pool、Redo Log、Bin Log、Undo Log、Channge Buffer
    查看>>
    MySQL InnoDB引擎的锁机制详解
    查看>>
    Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
    查看>>
    mysql InnoDB数据存储引擎 的B+树索引原理
    查看>>
    mysql innodb通过使用mvcc来实现可重复读
    查看>>
    mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
    查看>>