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 地址 …

C++Linux网络编程:简单的select模型运用

文章目录 前言源代码部分重点解读read/write与recv/send在使用上的差异 前言 这段代码来自于游双的《Linux高性能服务器编程》&#xff0c;在Ubuntu中对代码进行了实现&#xff0c;并在注释部分加上了我的个人解读。 源代码 // #include <sys/types.h> // 网络通讯的核…

JavaScript 设计模式之代理模式

代理模式 其实这种模式在现在很多地方也都有使用到&#xff0c;如 Vue3 中的数据相应原理就是使用的 es6 中的 Proxy 代理及 Reflect 反射的方式来处理数据响应式 我们日常在使用数据请求时&#xff0c;也会用到一些代理的方式&#xff0c;比如在请求不同的域名&#xff0c;端…

C++ 广度优先搜索的标记策略(五十六)【第三篇】

今天我们来看看bfs是如何规划标记策略的。 1.标记策略 但先等一下&#xff0c;先看一道题《一维坐标的移动》 在一个长度为 n 的坐标轴上&#xff0c;蒜头君想从 A 点 移动到 B 点。他的移动规则如下&#xff1a; 向前一步&#xff0c;坐标增加 1。 向后一步&#xff0c;坐…

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. 安…

不关电脑不仅仅是因为懒

程序员为什么不喜欢关电脑&#xff1f;不管用台式机&#xff0c;还是笔记本&#xff0c;总有一批程序员下班后从不关闭电脑&#xff0c;台式机按掉屏幕电源&#xff0c;笔记本直接合上休眠就是了。 这种现象说明这些程序员懒吗&#xff1f;还是有其它原因&#xff1f;从我自身的…

【网络层介绍】

文章目录 一、网络层概述1. 网络层的作用2. 网络层与其他层的关系 二、核心协议和技术1. IP协议2. 路由和转发3. 子网划分和超网 三、网络层设备1. 路由器2. 三层交换机 一、网络层概述 1. 网络层的作用 网络层主要负责在不同网络间传输数据包&#xff0c;确保数据能够跨越多…

在python中JSON数据格式的使用

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

Rust Option类型详解

在Rust中&#xff0c;Option是一种枚举类型&#xff0c;用于表示一个可能有值&#xff0c;也可能为空&#xff08;None&#xff09;的情况。它是Rust中对于空值安全处理的一种方式&#xff0c;与其他语言中的null或undefined相比&#xff0c;Option提供了更安全、更明确的方式来…

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;未安装的可以参考我之前的博客有将如何安装。同时默…

中科星图GVE(AI案例)——AI影像进行超分案例

简介 超分辨率图像处理是一种通过增加图像的空间分辨率来提高图像质量的技术。传统的超分辨率算法主要基于插值和滤波方法,然而这些方法往往无法准确恢复丢失的高频细节,导致图像出现模糊或失真。近年来,基于人工智能的超分辨率算法得到了广泛的关注和研究。下面将介绍AI影…

【开源】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可以做到资源的精细度划分。 对于磁盘…

ModuleNotFoundError: No module named ‘_bz2‘

今天装了py3.11&#xff0c;但是在导入pandas的时候出现了以下错误&#xff1a; from _bz2 import BZ2Compressor, BZ2Decompressor ModuleNotFoundError: No module named _bz2很显然缺少了依赖包&#xff0c;可以用 yum install bzip2进行安装&#xff0c;安装之后发现还是…

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

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