博客
关于我
如何回答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/

    你可能感兴趣的文章
    MyPython
    查看>>
    MTD技术介绍
    查看>>
    MySQL
    查看>>
    MySQL
    查看>>
    mysql
    查看>>
    MTK Android 如何获取系统权限
    查看>>
    MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
    查看>>
    MySQL - ERROR 1406
    查看>>
    mysql - 视图
    查看>>
    MySQL - 解读MySQL事务与锁机制
    查看>>
    MTTR、MTBF、MTTF的大白话理解
    查看>>
    mt_rand
    查看>>
    mysql -存储过程
    查看>>
    mysql /*! 50100 ... */ 条件编译
    查看>>
    mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
    查看>>
    mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
    查看>>
    mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
    查看>>
    mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
    查看>>
    MySQL 8.0 恢复孤立文件每表ibd文件
    查看>>
    MySQL 8.0开始Group by不再排序
    查看>>