TCP高频知识点

news2024/11/28 8:22:56

本篇文章主要讲述一下在面试过程中TCP的高频知识点

1.TCP三次握手流程图:

  1. 客户端发送一个SYN(同步)报文段给服务器,选择一个初始序列号,并设置SYN标志位为1。
  2. 服务器接收到客户端的SYN报文段后,回复一个ACK(确认)报文段,其中确认号设置为客户端发送的序列号加1,同时也选择一个初始序列号,并设置SYN和ACK标志位为1。
  3. 客户端接收到服务器的ACK报文段后,回复一个ACK报文段作为确认应答。其中确认号设置为服务器发送的序列号加1。

2.TCP的基本性质 

1.TCP是全双工的 可靠的 基于字节流的传输协议

2.同一个五元组只允许建立一条连接

3.通过序列号可以实现数据包按序收发 丢失重传

3.TCP三次握手的作用

  1. 确认双方的通信能力:通过三次握手,可以确保客户端和服务器都正常工作并且能够互相通信。
  2. 同步双方的初始序列号:TCP连接需要使用序列号来分割数据流,并提供可靠性保证。通过握手过程中的交换序列号,双方可以确定初始的序列号值。
  3. 防止旧连接影响新连接:在网络中可能存在延迟、重复或失序等问题,通过三次握手可以避免由于旧连接还未完全关闭而导致新连接产生混淆

TCP为什么不能进行两次挥手

1.无法避免旧的重复的初始化  从而造成资源的浪费

2.无法同步双端其实序列号 从而无法保证可靠传输

TCP四次挥手:

  1. 客户端发送一个终止连接请求给服务器,即发送一个FIN(Finish)报文段。
  2. 服务器接收到FIN报文段后,回复一个确认应答ACK报文段,表示已经接收到关闭请求。
  3. 服务器通知上层应用程序关闭连接,并发送一个FIN报文段给客户端。
  4. 客户端接收到服务器的FIN报文段后,回复一个确认应答ACK报文段,表示已经接收到服务器的关闭请求。
  5. 等待一段时间,确保双方都收到了对方的确认应答ACK报文段,然后彻底关闭连接。

TCP四次挥手的意义:

首先,TCP是一个全双工的协议,意味着客户端和服务器可以同时发送和接收数据。因此,在关闭连接时需要进行一系列步骤来确保双方都能够知道对方的关闭意图,并处理未及时接收的数据。

其次,四次挥手中包含两个方向上各两个报文段(FIN和ACK),用于通知对方自己准备关闭连接。这样可以保证每一方都有机会发出确认,避免一方过早地关闭连接导致数据丢失或重传。

还有一个重要的原因是,客户端在发送最后一个ACK报文段之后进入了"时间等待"状态。这是为了等待一定时间,以确保网络中所有延迟传输的数据都被接收完毕。如果立即关闭连接而不等待,可能会导致服务端发送的最后一部分数据无法被客户端正常接收。

TCP三次握手代码实例:

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

int main() {
    // 创建套接字
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    
    // 服务器地址和端口
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8888);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    
    // 发起连接请求
    connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));

    char buffer[1024];
    
    // 发送SYN报文段(第一次握手)
    send(sockfd, "SYN", strlen("SYN"), 0);

    // 接收服务端返回的SYN+ACK报文段(第二次握手)
    memset(buffer, 0, sizeof(buffer));
    recv(sockfd, buffer, sizeof(buffer)-1, 0);
    std::cout << "Received: " << buffer << std::endl;

    if (strcmp(buffer, "SYN+ACK") == 0) {
        // 发送ACK报文段(第三次握手)
        send(sockfd, "ACK", strlen("ACK"), 0);
        std::cout << "Handshake completed." << std::endl;
    } else {
        std::cout << "Handshake failed." << std::endl;
        close(sockfd);
        return -1;
    }

     // 关闭连接
     close(sockfd);

     return 0;
}

在这个示例代码中,首先创建一个套接字(socket)(注意socket使用),然后设置服务器地址和端口。使用connect函数发起连接请求。接下来,发送SYN报文段表示客户端希望建立连接。通过recv函数接收服务端返回的SYN+ACK报文段,并进行判断。如果接收到正确的报文段,则向服务端发送ACK报文段确认连接建立成功。最后,关闭连接。

TCP四次挥手代码实例:

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

int main() {
    // 创建套接字
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    
    // 服务器地址和端口
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8888);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    
    // 发起连接请求
    connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));

    char buffer[1024];
    
    // 发送FIN报文段(第一次挥手)
    send(sockfd, "FIN", strlen("FIN"), 0);

    // 接收服务端返回的ACK报文段(第二次挥手)
    memset(buffer, 0, sizeof(buffer));
    recv(sockfd, buffer, sizeof(buffer)-1, 0);
    
     std::cout << "Received: " << buffer << std::endl;

     if (strcmp(buffer, "ACK") == 0) {
         // 接收服务端发送的FIN报文段(第三次挥手)
         memset(buffer, 0, sizeof(buffer));
         recv(sockfd, buffer, sizeof(buffer)-1, 0);
         
         std::cout << "Received: " << buffer << std::endl;

         if (strcmp(buffer,"FIN") == 0) {
             // 发送ACK报文段(第四次挥手)
             send(sockfd,"ACK",strlen("ACK"), 0);
             std::cout << "Connection closed." << std::endl;
         }
     } else {
         std::cout << "Handshake failed." << std::endl;
         close(sockfd);
         return -1;
     }

    // 关闭连接
    close(sockfd);

    return 0;
}

在这个示例代码中,首先创建一个套接字(socket),然后设置服务器地址和端口。使用connect函数发起连接请求。接下来,发送FIN报文段表示客户端希望关闭连接。通过recv函数接收服务端返回的ACK报文段,并进行判断。如果接收到正确的ACK报文段,则继续接收服务端发送的FIN报文段。最后,向服务端发送ACK报文段确认关闭连接

好了 本篇文章就到这里结束了 在这里 小编给大家推荐一个课程:

https://xxetb.xetslk.com/s/2PjJ3T

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1448370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux_进程概念

硬件系统 软件系统 进程概念 进程状态 孤儿进程 进程优先级 一.硬件系统 1.1 冯诺依曼体系结构 数学家冯诺依曼提出了计算机制造的三个基本原则&#xff0c;即采用二进制逻辑、程序存储执行以及计算机由五个部分组成&#xff08;运算器、控制器、存储器、输入设备、输出设备&a…

MATLAB实现朴素贝叶斯分类

朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理的分类算法,它假设特征之间相互独立,从而简化了计算复杂性。该算法常用于文本分类、垃圾邮件过滤、情感分析等应用场景。 MATLAB实现鸢尾花数据集分类代码如下: clear load fisheriris X = meas(:,1:2); Y = species; labels…

勒索病毒最新变种.target勒索病毒来袭,如何恢复受感染的数据?

导言&#xff1a; 在当今数字化时代&#xff0c;数据被视为企业和个人最重要的资产之一。然而&#xff0c;随着技术的进步&#xff0c;网络安全威胁也在不断演变。其中&#xff0c;勒索病毒是一种极具破坏性的威胁&#xff0c;而".target"勒索病毒是近期备受关注的一…

【AI视野·今日CV 计算机视觉论文速览 第293期】Fri, 19 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Fri, 19 Jan 2024 Totally 103 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers ParaHome: Parameterizing Everyday Home Activities Towards 3D Generative Modeling of Human-Object Interactions Aut…

NSSCTF Round#18 RE GenshinWishSimulator WP

恶搞原神抽卡模拟器 看到软件的界面&#xff0c;大致有三种思路&#xff1a; 修改石头数量一直抽&#xff0c;如果概率正常肯定能抽到&#xff08;但是估计设置的概率是0&#xff09;在源码里找flag的数据把抽卡概率改成100%直接抽出来 Unity逆向&#xff0c;根据经验应该dnsp…

软考26-上午题-图3

一、图的遍历 从图中的某个顶点出发&#xff0c;沿着某条搜索路径对图中的所有顶点进行访问&#xff0c;且&#xff0c;只访问一次的过程。 图的遍历比树的遍历复杂&#xff0c;因为要避免对顶点进行重复访问&#xff0c;所以在图的遍历过程中&#xff0c;必须记下每个已访问…

文献速递:肿瘤分割---- 弱监督肝肿瘤分割,使用Couinaud区段标注

文献速递&#xff1a;肿瘤分割---- 弱监督肝肿瘤分割&#xff0c;使用Couinaud区段标注 01 文献速递介绍 肝癌是世界上导致癌症死亡的主要原因之一&#xff0c;也是第二大常见的癌症死因。本稿件于2021年10月28日收到&#xff0c;2021年11月24日修订&#xff0c;2021年12月1…

详解Vue文件结构+实现一个简单案例

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

thinkphp6入门(20)-- 如何上传图片、文件

1. 配置文件 设置上传的路径 对应文件夹 2. 前端 <div class"card-body"><h1 class"card-title">用户头像</h1><img src"../../../uploads/{$user.avatar_photo_path}" alt"avatar" height"100"/&g…

ICLR 2024 | Harvard FairSeg:第一个研究分割算法公平性的大型医疗分割数据集

近年来&#xff0c;人工智能模型的公平性问题受到了越来越多的关注&#xff0c;尤其是在医学领域&#xff0c;因为医学模型的公平性对人们的健康和生命至关重要。高质量的医学公平性数据集对促进公平学习研究非常必要。现有的医学公平性数据集都是针对分类任务的&#xff0c;而…

【开源】JAVA+Vue.js实现海南旅游景点推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

CUDA编程 - 共享内存 - shared memory - 学习记录

CUDA编程 - 共享内存 共享内存一、为什么要使用 shared memory&#xff1f;1.1、从硬件出发理解&#xff1a;1.2、从软件出发理解&#xff1a; 二、如何使用shared memory2.1、静态共享内存2.2、动态共享内存 三、实践 - 使用共享内存执行矩阵乘法总结 共享内存 一、为什么要使…

项目02《游戏-04-开发》Unity3D

基于 项目02《游戏-03-开发》Unity3D &#xff0c; 因前三集资源以及代码冗余问题&#xff0c;本次项目对前三集进行了重做&#xff0c;资源及代码如下&#xff0c; 首先导入场景及人物资源&#xff0c; 为人物添加动画控制器Animator组件&#xff0c; 创建动画控…

幻兽帕鲁游戏官方更新了版本,联机时提示版本不适用,无法加入,怎么办?

如果你在登录游戏的时候提示&#xff1a;您正在尝试加入的比赛正在运行不兼容的游戏版本。请尝试升级游戏版本。此时就说明你需要更新部署在服务器内的幻兽帕鲁了。 1、如果你使用幻兽帕鲁应用模板部署游戏&#xff0c;那么可以选择使用游戏配置面板一键更新。 2、如果你使用一…

《Git 简易速速上手小册》第3章:分支管理(2024 最新版)

文章目录 3.1 创建与合并分支3.1.1 基础知识讲解3.1.2 重点案例&#xff1a;为 Python 项目添加新功能3.1.3 拓展案例 1&#xff1a;使用 Pull Requests (PRs) 在团队中合作3.1.4 拓展案例 2&#xff1a;解决合并冲突 3.2 分支策略的最佳实践3.2.1 基础知识讲解3.2.2 重点案例&…

如何使用 sqlalchemy declarative base 多层次继承

在SQLAlchemy中&#xff0c;通过declarative_base创建的基类可以通过多层次的继承建立继承关系。这允许你在数据库中创建具有继承结构的表。在我使用某数据库做中转的时候&#xff0c;经常会遇到各种各样的问题&#xff0c;例如下面的问题&#xff0c;通过记录并附上完美的解决…

【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…

系统架构25 - 软件架构设计(4)

软件架构复用 软件产品线定义分类原因复用对象及形式基本过程 软件产品线 软件产品线是指一组软件密集型系统&#xff0c;它们共享一个公共的、可管理的特性集&#xff0c;满足某个特定市场或任务的具体需要&#xff0c;是以规定的方式用公共的核心资产集成开发出来的。即围绕…

力扣题目训练(9)

2024年2月2日力扣题目训练 2024年2月2日力扣题目训练412. Fizz Buzz414. 第三大的数415. 字符串相加129. 求根节点到叶节点数字之和131. 分割回文串65. 有效数字 2024年2月2日力扣题目训练 2024年2月2日第九天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;包括简…

MogaNet实战:使用 MogaNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…