TCP常见问题详解

这篇具有很好参考价值的文章主要介绍了TCP常见问题详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇文章我们介绍一下 在我们的面试中和实际开发中使用TCP遇到的问题

1.TCP在什么情况下出现大量的time_event

什么是time_event?

我们首先要弄清楚TIME_WAIT状态是什么?TIME_WAIT状态是主动关闭TCP连接的一方(即先发起FIN包的一方),在发送完最后一个ACK包后进入的状态。系统需要在TIME_WAIT状态下等待2MSL(maximum segment lifetime )后才能释放连接(端口)。根据RFC 793 MSL是2分钟,一般的TCP实现有30秒、1分钟和2分钟不等。进入TIME_WAIT状态等待2MSL主要有两个目的:一方面是主动关闭连接的一方在对方没有收到最后一个ACK包时(这时对方还会重发FIN,收到两个FIN的时间间隔一定小于2MSL)有时间可以重发ACK包,另一方面处于TIME_WAIT的连接(IP和端口组合)不能重用,这样可以保证被重新分配的socket不会受到之前残留的延迟重发报文影响。

由于主动关闭TCP连接的一方才会进入TIME_WAIT状态,一般情况服务器端不会出现TIME_WAIT状态,因为大多数情况都是客户端主动发起连接并主动关闭连接。但是某些服务如pop/smtp、ftp却是服务端收到客户端的QUIT命令后主动关闭连接,这就造成这类服务器上容易出现大量的TIME_WAIT状态的连接,而且并发量越大处于此种状态的连接越多。另外,对于被动关闭连接的服务在主动关闭客户端非法请求或清理长时间不活动的连接时(这种情况很可能是客户端程序忘记关闭连接)也会出现TIME_WAIT的状态。

2.TCP粘包解决的办法

黏包问题是指在传输过程中多个数据包被合并成了一个或者一个数据包被拆分成了多个,造成接收方无法正确解析。解决黏包问题的方法主要有以下两种:

  1. 固定包头接收:发送方在每个数据包前加上固定长度的头部信息,接收方先读取头部信息获取数据包长度,再根据长度截取对应的数据。这样可以保证每次接收到的数据都是完整的。

  2. 指定内存长度:发送方在每个数据包前不添加任何头部信息,而是在尾部添加一个特殊字符(例如换行符“\n”),接收方按照特殊字符进行切割,并且预先给缓存区分配足够长的空间来容纳整个消息。这样也能确保接收到的数据都是完整的。

 解决TCP粘包的代码实例:

核心思想:在C++中,处理TCP粘包问题通常涉及到自定义协议来区分数据包。这意味着需要设计一种机制来标记每个数据包的开始和结束。

 服务器端:

#include <boost/asio.hpp>  
#include <iostream>  
#include <vector>  
  
using boost::asio::ip::tcp;  
  
class session : public std::enable_shared_from_this<session> {  
public:  
    session(tcp::socket socket) : socket_(std::move(socket)) {}  
  
    void start() {  
        do_read();  
    }  
  
private:  
    void do_read() {  
        auto self(shared_from_this());  
        char buffer[1024];  
  
        socket_.async_read_some(boost::asio::buffer(buffer),  
            [this, self](boost::system::error_code ec, std::size_t length) {  
                if (!ec) {  
                    std::cout.write(buffer, length);  
                    std::cout << std::endl;  
  
                    do_read();  
                }  
            });  
    }  
  
    tcp::socket socket_;  
};  
  
int main(int argc, char* argv[]) {  
    try {  
        if (argc != 2) {  
            std::cerr << "Usage: async_tcp_echo_server <port>\n";  
            return 1;  
        }  
  
        boost::asio::io_context io_context;  
  
        tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), std::atoi(argv[1])));  
  
        for (;;) {  
            tcp::socket socket(io_context);  
            acceptor.async_accept(socket,  
                [&](boost::system::error_code ec) {  
                    if (!ec) {  
                        std::make_shared<session>(std::move(socket))->start();  
                    }  
                });  
        }  
  
        io_context.run();  
    }  
    catch (std::exception& e) {  
        std::cerr << "Exception: " << e.what() << "\n";  
    }  
  
    return 0;  
}

客户端代码:

#include <boost/asio.hpp>  
#include <iostream>  
  
using boost::asio::ip::tcp;  
  
int main(int argc, char* argv[]) {  
    try {  
        if (argc != 3) {  
            std::cerr << "Usage: async_tcp_echo_client <host> <port>\n";  
            return 1;  
        }  
  
        boost::asio::io_context io_context;  
  
        tcp::resolver resolver(io_context);  
        tcp::resolver::results_type endpoints = resolver.resolve(argv[1], argv[2]);  
  
        tcp::socket socket(io_context);  
        boost::asio::connect(socket, endpoints);  
  
        for (int i = 0; i < 5; ++i) {  
            std::string message = "Hello, world! (" + std::to_string(i) + ")\n";  
  
            boost::asio::write(socket, boost::asio::buffer(message));  
        }  
  
        io_context.run();  
    }  
    catch (std::exception& e) {  
        std::cerr << "Exception: " << e.what() << "\n";  
    }  
  
    return 0;  
}

 总结:本篇文章描述了C++的常见的一些问题  粘包 时间等待线程  这些在我们的开发中有时候会遇到 我们要积极的解决 否则就会出现很多问题

好了 本篇文章就到这里结束了 在这里我给大家推荐一个性价比很高的课程:

 https://xxetb.xetslk.com/s/2PjJ3T文章来源地址https://www.toymoban.com/news/detail-829837.html

到了这里,关于TCP常见问题详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络基础】TCP协议之三次握手&四次挥手--详解与常见问题解答

    目录 TCP 的特性 三次握手与四次挥手 三次握手:  灵魂拷问: 四次挥手: 灵魂拷问: 三次握手: 所谓 三次握手 (Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。 三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列

    2024年01月20日
    浏览(53)
  • TCP 常见问题

    一、概要 TCP协议是有连接的,可靠性传输,全双工,面向字节流的传输层协议, 使用TCP协议在客户端和发送端传输数据前,必须先建立连接,传输数据完成之后,就要断开连接 二、过程 1. 握手 为什么需要三次握手才能建立连接 ? 为了初始化Sequence Number 的初始值 ,实现可靠数据传输

    2024年01月19日
    浏览(31)
  • TCP常见问题

    在一段时间内,如果TCP连接两方都没有数据交互,TCP的保活机制**(TCP keepalive)**会起作用,每隔一个时间段会发送一个探测报文,如果连着好几个探测报文都没有得到相应,则会认为当前TCP连接已经GG,系统内核会将错误信息通知给上层应用程序。 在没有开启TCP keepalive的情

    2024年02月02日
    浏览(66)
  • kubernetes常见面试问题详解

    在面试的时候,面试官常常会问一些问题: k8s是什么?有什么用? k8s由哪些组件组成? pod的启动流程? k8s里有哪些控制器? k8s的调度器里有哪些调度算法? pod和pod之间的通信过程? 外面用户访问pod数据流程? 你常用哪些命令? 容器的类型? 3种探针? pod的升级? HPA、V

    2024年02月10日
    浏览(47)
  • docker常见面试问题详解

    在面试的时候,面试官常常会问一些问题: docker是什么,能做什么? docker和虚拟机的区别是什么呢? docker是用什么做隔离的? docke的网络类型?docker数据之间是如何通信的? docker的数据保存问题? 常用的docker命令? docker制作镜像相关? 下面,就让我来详细说明一些这些问

    2024年02月10日
    浏览(45)
  • 详解:搭建常见问题(FAQ)的步骤?

    许多的Web用户都更加偏向于可信赖的FAQ页面,以此作为快速查找更多信息的方法。因为用户时间的紧缺,并且想知道产品的功能和能够提供的服务。构造精巧的FAQ页面是提供人们寻求信息的绝妙方法,而且还可以提供更多的信息。这就是为什么FAQ页面对企业、客户和企业的利

    2024年02月02日
    浏览(42)
  • RabbitMQ详解与常见问题解决方案

    RabbitMQ 是一个开源的消息中间件,使用 Erlang 语言开发。这种语言天生非常适合分布式场景,RabbitMQ 也就非常适用于在分布式应用程序之间传递消息。RabbitMQ 有非常多显著的特点: 消息传递模式 :RabbitMQ 支持多种消息传递模式,包括发布/订阅、点对点和工作队列等,使其更

    2024年03月15日
    浏览(78)
  • CAN协议详解+常见问题汇总,吐血整理!!!

    文章分两部分,一是CAN的详解,二是常见问题汇总;文章长,但是都是重点精华,往有帮助~ (参考的是火哥的STM32有关CAN协议的文档) 一、CAN的详解 1. 物理层 CAN总线:成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线。 CAN是异步通讯,只有CAN_High和CAN_Low两条信

    2024年02月08日
    浏览(40)
  • 「MySQL」MySQL面试题全解析:常见问题与高级技巧详解

    回答:数据库是一个组织和存储数据的集合,可通过各种方式对数据进行访问、管理和操作。 回答:MySQL是一种开源的关系型数据库管理系统,广泛用于Web应用程序的后端数据存储。 回答:SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言,用于查询、插入

    2024年02月10日
    浏览(40)
  • 损失函数(Loss Function)一文详解-分类问题常见损失函数Python代码实现+计算原理解析

    目录 前言 一、损失函数概述 二、损失函数分类 1.分类问题的损失函数

    2023年04月26日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包