TCP高频知识点

本篇文章主要讲述一下在面试过程中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.mzph.cn/news/682989.shtml

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

相关文章

OJ刷题:杨氏矩阵【建议收藏】

看见这个题目&#xff0c;很多人的第一反应是遍历整个数组查找数字&#xff0c;但是这种方法不仅效率低&#xff0c;而且远远不能满足题目要求。下面介绍一种高效的查找方法&#xff1a; 代码实现&#xff1a; #include <stdio.h>int Yang_Find_Num(int arr[][3], int …

steam游戏搬砖项目靠谱吗?有没有风险?

作为一款fps射击游戏&#xff0c;csgo在近几年可谓是火出圈&#xff0c;作为一款全球竞技游戏&#xff0c;深受玩家喜爱追捧&#xff0c;玩家追求的就是公平公正&#xff0c;各凭本事&#xff0c;像其他游戏可能还会有皮肤等装备属性加成&#xff0c;在csgo里面是不存在的。 纯…

K8sGPT 的使用

K8sGPT 介绍 k8sgpt 是一个扫描 Kubernetes 集群、诊断和分类问题的工具。它将 SRE 经验编入其分析器中&#xff0c;并帮助提取最相关的信息&#xff0c;通过人工智能来丰富它。它还可以与 OpenAI、Azure、Cohere、Amazon Bedrock 和本地模型结合使用。 K8sGPT Github 地址 …

Vue插槽

Vue插槽 一、插槽-默认插槽1.作用2.需求3.问题4.插槽的基本语法5.代码示例6.总结 二、插槽-后备内容&#xff08;默认值&#xff09;1.问题2.插槽的后备内容3.语法4.效果5.代码示例 三、插槽-具名插槽1.需求2.具名插槽语法3.v-slot的简写4.代码示例5.总结 四、作用域插槽1.插槽…

安卓价值1-如何在电脑上运行ADB

ADB&#xff08;Android Debug Bridge&#xff09;是Android平台的调试工具&#xff0c;它是一个命令行工具&#xff0c;用于与连接到计算机的Android设备进行通信和控制。ADB提供了一系列命令&#xff0c;允许开发人员执行各种操作&#xff0c;包括但不限于&#xff1a; 1. 安…

在python中JSON数据格式的使用

什么是JSON&#xff1f; JSON是一种数据格式&#xff0c;由美国程序设计师DouglasCrockford创建的&#xff0c;JSON全名是JavaScript Object Notation,由JSON英文全文字义我们可以推敲JSON的缘由&#xff0c;最初是为JavaScript开发的。这种数据格式由于简单好用被大量应用在We…

DS Wannabe之5-AM Project: DS 30day int prep day15

Q1. What is Autoencoder? 自编码器是什么&#xff1f; 自编码器是一种特殊类型的神经网络&#xff0c;它通过无监督学习尝试复现其输入数据。它通常包含两部分&#xff1a;编码器和解码器。编码器压缩输入数据成为一个低维度的中间表示&#xff0c;解码器则从这个中间表示重…

数据库被人破解,删除数据,勒索

事情是这样的&#xff0c;我买了一台服务器自己部署项目玩儿玩儿&#xff0c;我的数据库运行在3306端口&#xff0c;密码没改&#xff0c;就是默认的123456&#xff0c;诡异的事情发生了&#xff0c;用了一段时间之后&#xff0c;数据库突然连接不上了&#xff0c;我一通操作猛…

Python爬虫——解析库安装(1)

目录 1.lxml安装2.Beautiful Soup安装3.pyquery 的安装 我创建了一个社区&#xff0c;欢迎大家一起学习交流。社区名称&#xff1a;Spider学习交流 注&#xff1a;该系列教程已经默认用户安装了Pycharm和Anaconda&#xff0c;未安装的可以参考我之前的博客有将如何安装。同时默…

【开源】SpringBoot框架开发企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…

Linux多线程[二]

引入知识 进程在线程内部执行是OS的系统调度单位。 内核中针对地址空间&#xff0c;有一种特殊的结构&#xff0c;VM_area_struct。这个用来控制虚拟内存中每个malloc等申请的空间&#xff0c;来区别每个malloc的是对应的堆区哪一段。OS可以做到资源的精细度划分。 对于磁盘…

嵌入式软件设计入门:从零开始学习嵌入式软件设计

&#xff08;本文为简单介绍&#xff0c;个人观点仅供参考&#xff09; 首先,让我们了解一下嵌入式软件的定义。嵌入式软件是指运行在嵌入式系统中的特定用途软件,它通常被用来控制硬件设备、处理实时数据和实现特定功能。与桌面应用程序相比,嵌入式软件需要具备更高的实时性、…

反无人机系统技术分析,无人机反制技术理论基础,无人机技术详解

近年来&#xff0c;经过大疆、parrot、3d robotics等公司不断的努力&#xff0c;具有强大功能的消费级无人机价格不断降低&#xff0c;操作简便性不断提高&#xff0c;无人机正快速地从尖端的军用设备转入大众市场&#xff0c;成为普通民众手中的玩具。 然而&#xff0c;随着消…

Python算法题集_翻转二叉树

Python算法题集_翻转二叉树 题226&#xff1a;翻转二叉树1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【DFS递归】2) 改进版一【BFS迭代&#xff0c;节点循环】3) 改进版二【BFS迭代&#xff0c;列表循环】 4. 最优算法 本文为Python算法题集…

Spring Boot 笔记 019 创建接口_文件上传

1.1 创建阿里OSS bucket OSS Java SDK 兼容性和示例代码_对象存储(OSS)-阿里云帮助中心 (aliyun.com) 1.2 编写工具类 package com.geji.utils;import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun…

加速创新如何先从创意管理开始?

文章详细介绍了什么是创意管理以及它在组织中的重要性和最佳实践。创意管理是指在组织内捕捉、组织、评估和实施创意的过程。它通过建立一个结构化的系统&#xff0c;从员工、客户或其他利益相关者那里收集创意&#xff0c;并系统地审查和选择最有前景的创意进行进一步的开发或…

算法学习——LeetCode力扣回溯篇3

算法学习——LeetCode力扣回溯篇3 491. 非递减子序列 491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。…

2024龙年特别篇 -- 魔法指针 之 指针变量的意义 指针运算

学习完指针变量&#xff1a;链接后&#xff0c; 我们继续学习指针变量的应用 目录 程序展示 原始方式 指针变量方式 代码对比 指针运算 指针-整数 用指针打印数组内容 使用指针打印1-10中的奇数 指针-指针 指针的关系运算 程序展示 打印一个有10个元素的数组&am…

语言与科技创新(大语言模型对科技创新的影响)

1.科技创新中的语言因素 科技创新中的语言因素至关重要&#xff0c;具体体现在以下几个方面&#xff1a; 科技文献交流&#xff1a; 英语作为全球科学研究的通用语言&#xff0c;极大地推动了科技成果的国际传播与合作。科学家们在发表论文、报告研究成果时&#xff0c;大多选…

ChatGPT高效提问—prompt实践(教师助手)

ChatGPT高效提问—prompt实践&#xff08;教师助手&#xff09; 下面来看看ChatGPT在教育领域有什么用途。 首先设定ChatGPT的角色为高中教师助手。 输入prompt: ChatGPT输出&#xff1a; ​ 教师助手的角色已经设置完成。下面通过几种不同的情景演示如何使用。 1.1.1 制定…