网络编程常见问题

1、TCP状态迁移图

2、TCP三次握手过程

2.1、握手流程

1、TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;

2、TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。

3、TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。

4、TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。

5、当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了

2.2、三次握手发生在socket的那几个函数中

从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立

2.3、连接队列

syn队列:半连接队列

accept队列:全连接队列

3、TCP四次挥手过程

四次挥手不分客户端、服务器,谁先发发起close则谁就是主动断开一方,否则为主动断开一方,主动方发生FIN包后会进入到FIN_WAIT_1状态,也就是不管客户端还是服务器都有可能进入FIN_WAIT_1的状态,也都有可能进入TIME_WAIT的状态。

socket中的四次握手释放连接的过程调用的函数:

图示过程如下:

  • 某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;
  • 另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
  • 一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;
  • 接收到这个FIN的源发送端TCP对它进行确认。

这样每个方向上都有一个FIN和ACK。

4、为什么会有WIME_WAIT状态

为了避免最后一次ACK丢失对端没有收到,对端会重传FIN执行第三次跟第四次挥手,TIME_WAIT状态还能够响应,也就是为了确保对方收到最后的ACK,从而确保对方也能正常的断开连接

5、出现大量的CLOSE_WAIT状态连接的原因

close_wait状态出现在被动断开的一方,如果被动断开,一般recv会返回0,出现大量的close_wait是因为对方的断开事件没有得到及时的处理,解决方式就是及时处理对端的close事件(recv() == 0),可以将IO事件的检测跟io事件的响应分开处理,以保证能够及时的检测到IO断开事件

6、哪些场景会出来CLOSING的状态

双方同时调用close

7、TCP首部长度,有哪些字段

详见:TCP之报文首部格式 - Jummyer - 博客园 (cnblogs.com)

8、TCP在listen时的参数backlog的意义

backlog 表示accept全连接队列的大小,也就是三次握手完成后,server没有调用accept从 全连接队列 取出连接时,连接队列中最大可存放的数量

9、acept发生在三次握手的哪一步

第三步

10、SYN攻击

服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。SYN 攻击是一种典型的 DoS/DDoS 攻击

11、TCP与UDP的区别

11.1、TCP、UDP的区别

  • TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。
  • UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。

1)TCP是面向连接的,UDP是面向无连接的

2)UDP程序结构较简单

3)TCP是面向字节流的,UDP是基于数据报的

4)TCP保证数据正确性,UDP可能丢包

5)TCP保证数据顺序到达,UDP不保证

11.2、TCP、UDP的优缺点

TCP优点:可靠稳定

TCP的可靠体现在TCP在传输数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完之后,还会断开来连接用来节约系统资源。

TCP缺点:慢,效率低,占用系统资源高,易被攻击

在传递数据之前要先建立连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞机制等都会消耗大量时间,而且要在每台设备上维护所有的传输连接。然而,每个连接都会占用系统的CPU,内存等硬件资源。因为TCP有确认机制、三次握手机制,这些也导致TCP容易被利用,实现DOS、DDOS、CC等攻击。

UDP优点:快,比TCP稍安全

UDP没有TCP拥有的各种机制,是一种无状态的传输协议,所以传输数据非常快,没有TCP的这些机制,被攻击利用的机会就少一些,但是也无法避免被攻击。

UDP缺点:不可靠,不稳定

因为没有TCP的这些机制,UDP在传输数据时,如果网络质量不好,就会很容易丢包,造成数据的缺失。

11.3、TCP UDP适用场景

TCP:传输一些对信号完整性,信号质量有要求的信息。

UDP:对网络通讯质量要求不高时,要求网络通讯速度要快的场景。

11.4、tcp 怎样保证数据正确性

  • 差错控制:发送的数据包的二进制相加然后取反,检测数据在传输过程中的任何变化,如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。编号 + 排序 TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层 确认 + 超时重传的机制 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
  • 流量控制:TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓存区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。
  • 拥塞控制:当网络拥塞时,减少数据的发送。发送方有拥塞窗口,发送数据前比对接收方发过来的接收窗口,取两者的最小值---慢启动、拥塞避免、拥塞发送、快速恢复

12、三次握手,服务端和客户端,分别发生在哪个函数中

客户端:connect

服务端:listen之后、accept之前,被动实现的。accept会从全连接队列中取出一个

节点(TCP控制块),然后为该节点分配一个socket

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

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

相关文章

WebSockets 完全指南:在 Postman 中测试实时通信

标题:WebSockets 完全指南:在 Postman 中测试实时通信 摘要 Postman 是 API 开发者广泛使用的工具,支持 RESTful API 的测试和调试。随着实时通信的兴起,WebSockets 协议变得日益重要。本文将详细介绍如何在 Postman 中测试 Web…

改进经验模态分解方法-通过迭代方式(IMF振幅加权频率,Python)

一种新颖的改进经验模态分解方法-通过迭代方式(IMF振幅加权频率)有效缓解了模态混叠缺陷,以后慢慢讲,先占坑。 import numpy as np import matplotlib.pyplot as plt import os import seaborn as sns from scipy import stats i…

【python学习】bytearray 数组

在Python中,bytearray 是一个可变序列,用于表示一个字节数组。与不可变的 bytes 类型相比,bytearray 允许你修改其内容。你可以通过索引来访问和修改 bytearray 中的元素,也可以添加或删除元素。 使用 bytearray 的一些示例&…

C语言图书管理系统控制台程序

程序示例精选 C语言图书管理系统控制台程序 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《C语言图书管理系统控制台程序》编写代码,代码整洁,规则,易读…

740. 删除并获得点数(leetcode)

740. 删除并获得点数(leetcode) 题目描述 给你一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 …

目标检测算法用一个案例详细讲解

学习目标: 目标检测算法用一个案例详细讲解 学习内容: 主要以YOLO为例 YOLO 工作流程 输入图像: 首先,输入一张图像,该图像将被调整为固定大小(如 416x416)。网格划分: 图像被划分…

加密与安全_三种方式实现基于国密非对称加密算法的加解密和签名验签

文章目录 国际算法基础概念常见的加密算法及分类签名和验签基础概念常见的签名算法应用场景 国密算法对称加密(DES/AES⇒SM4)非对称加密(RSA/ECC⇒SM2)散列(摘要/哈希)算法(MD5/SHA⇒SM3) Code方式一 使用B…

智慧园区综合平台解决方案PPT(75页)

## 智慧园区的理解 ### 从园区1.0到园区4.0的演进 1. 园区1.0:以土地经营为主,成本驱动,提供基本服务。 2. 园区2.0:服务驱动,关注企业成长,提供增值服务。 3. 园区3.0:智慧型园区&#xff…

机器学习引领教育革命:智能教育的新时代

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀目录 📒1. 引言📙2. 机器学习在教育中的应用🌞个性化学习🌙评估与反馈的智能化⭐教学资源的优…

spring-boot-configuration-processor注释处理器

开源项目SDK:https://github.com/mingyang66/spring-parent 个人文档:https://mingyang66.github.io/raccoon-docs/#/ spring-boot-configuration-processor是springboot提供的一个注释处理器(annotation processor),它用于在编译…

Python多线程Concurrent

背景 从 Python3.2 开始,标准库为我们提供了 concurrent.futures 模块,它提供了 ThreadPoolExecutor 和 ProcessPoolExecutor两个类,实现了对 threading 和 multiprocessing 的进一步抽象(这里主要关注线程池)&#x…

STC89C52RC单片机设计的FM收音机+自动搜台+存储电台(程序+原理图+PCB)

资料下载地址&#xff1a;STC89C52RC单片机设计的FM收音机自动搜台存储电台&#xff08;程序原理图PCB) 1、实物图 2、部分程序 #include <reg52.h> #include "tea5767.h" #include "delay.h" #include "lcd1602.h" //K1:上一台 K2:下一…

mac电脑游戏推荐:NBA 2K24 街机版下载

NBA 2K24 街机版是一款由2K Sports开发并发行的篮球游戏&#xff0c;属于著名的NBA 2K系列。这款游戏为玩家提供了与NBA联赛中真实球员和球队互动的机会&#xff0c;体验篮球比赛的激情与紧张。街机版的NBA 2K24通常会在游戏厅、商场等公共场所设置&#xff0c;供玩家投币游玩。…

ubuntu server的安装

官网&#xff1a;https://ubuntu.com/ 点击 Get Ubuntu,选择Server&#xff0c;点击Get Ubuntu Server,下载iso到本地。 相关资料&#xff1a; Ubuntu Server 20.04详细安装教程虚拟机安装 Ubuntu

c++重载(运算符)

1&#xff09;C入门级小知识&#xff0c;分享给将要学习或者正在学习C开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 对于系统的所有操作符&#xff0c;一般情况下&#xff0c;只支持基本数…

Android Gradle 开发与应用 (二): Android 项目结构与构建配置

目录 1. Android 项目的 Gradle 文件结构 1.1 项目根目录 1.2 模块目录 2. Gradle 构建配置详解 2.1 配置 Android 项目的 build.gradle 2.2 配置模块的 build.gradle 2.3 使用 productFlavors 管理多版本应用 2.4 使用 buildConfigField 注入构建常量 在 Android 开发…

AWTK 用 icon_at 属性设置图标位置

1. style 在 style 文件中通过 icon_at 属性设置图标位置。 <style name"right_bottom" icon_at"right_bottom"><normal icon"unchecked_right_bottom" /><pressed icon"unchecked_right_bottom" /><over i…

redis实战-短信登录

基于session的登录流程 session的登录流程图 1. 发送验证码 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff0c;如果不合法&#xff0c;则要求用户重新输入手机号 如果手机号合法&#xff0c;后台此时生成对应的验证码&#xff0c;同时将验证码进行保存&#x…

第2章:程序设计语言

第2章&#xff1a;程序设计语言 在源程序中&#xff0c;可由用户&#xff08;程序员&#xff09;为变量、函数和数据类型等命名。 脚本语言一般运行在解释器或虚拟机中&#xff0c;便于移植&#xff0c;开发效率较高。 变量是计算机内存单元的抽象&#xff0c;在程序中表示数据…

1186. 删除一次得到子数组最大和(leetcode)

1186. 删除一次得到子数组最大和&#xff08;leetcode&#xff09; 题目描述 给你一个整数数组&#xff0c;返回它的某个 非空 子数组&#xff08;连续元素&#xff09;在执行一次可选的删除操作后&#xff0c;所能得到的最大元素总和。换句话说&#xff0c;你可以从原数组中选…