关键词:

OSI是Open System Interconnect的缩写,意为开放式系统互联。

RTT : Round-Trip time 往返时间

RTO:Retransmission Timeout超时重传时间

MSL : 

OSI 七层模型和 TCP/IP 四层模型

OSI七层模型和TCP/IP五层模型(原来应该是四层,新版教程改成五层)的映射关系,以及对应的功能和协议:

image

OSI七层模型TCP/IP五层模型对应网络协议功能
应用层(Application)应用层(Application)HTTP、TFTP, FTP, NFS, WAIS、SMTP文本传输、电子邮件、文件服务、虚拟终端等
表示层(Presentation)Telnet, Rlogin, SNMP, Gopher数据格式化、代码转换、数据加密
会话层(Session)SMTP, DNS解除/建立与别的连接点的Connection
传输层(Transport)传输层(Transport)TCP, UDP提供端对端接口
网络层(Network)网络层(Network)IP, ICMP, ARP, RARP, AKP, UUCP为数据包提供路由选择
数据链路层(Data Link)数据链路层(Data Link)FDDI, Ethernet, Arpanet, PDN, SLIP, PPP传输带地址的帧、提供错误检测功能
物理层(Physical)物理层(Physical)IEEE 802.1A, IEEE 802.2到IEEE 802.11以二进制数据形式在物理媒介上传输数据

无论哪种模型,都可以看出来,四层是指传输层,七层是指应用层

TCP三次握手四次挥手

TCP是面向连接的,所有的连接是指双方都确认了连接的建立。

三次握手

我们来看一下三次握手的过程:

  • 一开始,客户端和服务端都处于 CLOSED 状态。客户端主动打开连接,服务端被动打卡连接,结束CLOSED 状态,开始监听,进入 LISTEN状态。

一次握手

客户端会随机初始化序号(client_isn),

  • 将此序号置于 TCP 首部的「序号」字段中,
  • 同时把 SYN 标志位置为 1 ,表示 SYN 报文。

接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接。该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。

二次握手

服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),

  • 将此序号填入 TCP 首部的「序号」字段中,
  • 其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1,
  • 接着把 SYN 和 ACK 标志位置为 1

最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。

三次握手

客户端收到服务端报文后,还要向服务端回应最后一个应答报文,

  • 首先该应答报文 TCP 首部 ACK 标志位置为 1 ,
  • 其次「确认应答号」字段填入 server_isn + 1 ,

最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。

好了,经过三次握手的过程,客户端和服务端之间的确定连接正常,接下来进入ESTABLISHED状态,服务端和客户端就可以快乐地通信了。

问题:为什么是三次,不是两次、四次?

两次:如果只有前两次,服务端会认为连接已经建立,如果客户端后续不在发送报文,也就是客户端不认可这个链接,相当于这个连接资源浪费了。

四次:三次就可以完成双方的确认,没有必要多进行一次。

四次挥手

一次挥手

  • 客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。

二次挥手

  • 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状态。

三次挥手

  • 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。

四次挥手

  • 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
  • 服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,至此服务端已经完成连接的关闭
  • 客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,至此客户端也完成连接的关闭。

可以看到,每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手

问题:为什么是四次,不是三次?

三次:如果是三次,需要将服务端的ACK和FIN包合成一次发送,但是服务端在收到客户端的FIN包后,需要释放资源等各种善后操作,这个会比较浪费时间,导致给客户端端的响应时间超时,从而导致客户端重发FIN包。 所以将服务端的ACK和FIN分开发送。

思考:为什么握手需要经过双方对彼此的确认, 而挥手只需要一方对另一方的确认就可以了呢?

握手需要双方对彼此的确认,是要保证连接得到双方认可(不浪费);挥手其实也是双方对彼此的确认, 只不过是分两阶段进行的。

TCP与UDP

TCP是一个面向连接的、可靠的、基于字节流的传输层协议。

UDP是一个面向无连接的传输层协议。

面向连接:指的是客户端和服务端建立连接,在双方相互通信之前,TCP需要三次握手建立连接,而UDP没有建立连接的过程。

可靠性:TCP花了很多的功夫保障连接的可靠性

  • TCP有状态:TCP会进准记录哪些数据发送了,哪些数据被对方接受了,哪些没有被接受,而且保证数据包按序到达,不允许半点差错。
  • TCP可空:意识到丢包了或者网络环境不佳,TCP会根据情况调整自己的行为,控制自己的发送速度或者重发。

报文中的序列号

凡是对端的确认都需要序列号,防止端发送重复的报文。这样也使得调用有顺序性。

TCP中的端口号

端口号位于传输层的TCP报文头中。端口号用两个字节表示,最大值65535

1. 熟知的端口号:0~1023

  • HTTP: 80
  • HTTPS: 443
  • FTP: 21
  • SSH: 22
  • Telnet: 23
  • SMTP: 25
  • DNS: 53

2. 已登记的端口号:1024~49151

  • MySQL: 3306
  • Oracle DB: 1521
  • Redis: 6379
  • MongoDB: 27017
  • Tomcat: 8080

3. 临时端口号:49152~65535 

        你的浏览器在访问网站时,操作系统会随机分配这个范围内的一个端口作为源端口

telnet用法

1. telnet ip/domianName  port :远端这个地址下的这个端口是否可以访问

2. telnet 发送http请求

输入红框里的内容, 发送http请求,就会得到http的响应

curl  命令同样可以访问网络域名

netstat

> netstat -at

> netstat -au

tcpdump

是一个命令行的网络流量分析工具,功能非常强大,一般用于抓TCP的包。

tcpdump -i any host 180.101.49.44

  • tcpdump 抓包
  • -i  在机器的网卡上抓包
  • any 任意网卡
  • 180.101.49.44  某次测试时百度的地址

 参考:

1. 深入分析四层/七层网关 - Hello-Brand - 博客园

2. “三次握手,四次挥手”这么讲,保证你忘不了 - 三分恶 - 博客园

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

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

相关文章

vscode有的结构体不能补全,有的可以补全问题的解决.

定义了一个结构体,发现不能自动补全变量名称.而另外一个结构体却可以正常补全.经过研究发现是,新定义的结构体变量类型uint32_t,vscode认为其是错误类型导致的.暂时改为int型,后发现问题消失.可以正常补全了.由于工程使用cubeide生成,uint32_t定义在软件安装目录,并没有和项目文…

JavaScript 数组核心操作实战:最值获取与排序实现(从基础到优化)

在JavaScript开发中,数组的“最值获取”和“排序”是高频需求。本文将基于你的原始代码,系统解析数组最值获取、升序/降序排序的实现逻辑,通过“问题分析→代码优化→原理讲解”的流程,帮助你掌握更灵活、高效的数组操作方法&…

driver.js实现前端页面引导

1.安装 npm install driver.js2.实现代码示例 <template><div class"home-container"><!-- 页面内容 --><LeftPanel id"guide-left-panel" /><button id"guide-file-upload">文件上传</button><button i…

技术速递|使用 AI 应用模板扩展创建一个 .NET AI 应用与自定义数据进行对话

在本快速入门中&#xff0c;你将学习如何使用 .NET AI 应用模板创建一个 .NET AI 应用&#xff0c;与自定义数据进行对话。该模板旨在简化 .NET 构建 AI 应用的上手体验&#xff0c;帮助你处理常见的设置任务和配置。 先决条件 .NET 9.0 SDK 以下任一 IDE&#xff08;可选&am…

使用Cloudflare的AI Gateway代理Google AI Studio

1、说明详见&#xff1a;详见&#xff1a;https://developers.cloudflare.com/ai-gateway/usage/providers/google-ai-studio在"Google AI Studio"创建"API key" 在"Cloudflare"创建"AI Gateway"、获取"Account ID"2、在“G…

Scrapy 框架实战:构建高效的快看漫画分布式爬虫

一、Scrapy框架概述 Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架&#xff0c;它提供了强大的数据提取能力、灵活的扩展机制以及高效的异步处理性能。其核心架构包括&#xff1a; Engine&#xff1a;控制所有组件之间的数据流&#xff0c;当某个…

数据结构(C语言篇):(六)单链表算法题(下)

目录 前言 一、链表的回文结构 二、相交链表 三、环形链表​编辑 四、环形链表II 总结 前言 本篇博客将继续介绍单链表相关的算法题&#xff0c;包括了链表的回文结构、相交链表、环形链表等。现在就让我们正式开始吧&#xff01; 一、链表的回文结构 题目链接&#xff1a…

【AI自动化】VSCode+Playwright+codegen+nodejs自动化脚本生成

VSCodePlaywrightnodejs&#xff0c;能完美实现UI自动化全流程脚本自动生成和回放&#xff0c;生成的脚本方便维护&#xff0c;回放执行快速&#xff1b; 概述 Playwright 是由Microsoft开发的一个开源的跨浏览器自动化测试库&#xff0c;它支持Chromium、WebKit和Firefox浏览…

基于能量方法的纳维-斯托克斯方程高阶范数有界性理论推导-陈墨仙

写在最前面&#xff0c;圈外人&#xff0c;没有背书没有教育邮箱&#xff0c;发不了预印本&#xff0c;我先发csdn。刚才首发没复制完&#xff0c;抱歉&#xff0c;现在编辑下。基于能量方法的纳维-斯托克斯方程高阶范数有界性理论推导作者 陈墨仙邮件 2488888241qq.com摘要纳维…

Labview邪修01:贪吃蛇

从博主很小的时候就在掌机上玩过这个贪吃蛇的小游戏&#xff0c;突然有一天心血来潮的想Labview是不是也可以编这个小游戏&#xff0c;回忆一下童年&#xff01;然后就又了下面的这个程序&#xff0c;执行结果如下图所示。 基本功能&#xff1a; 1&#xff09;点击开始按钮&am…

将自己的jar包发布到maven中央仓库(2025-08-29)

将自己的jar包发布到maven中央仓库(2025-08-29) 一、注册账号 https://central.sonatype.com/ 二、新建命名空间 这里的命名空间需要填写github的用户名因为我的用户名是daimao0,所以命名空间填io.github.daimao0 这里要求你建一个名为ubuxfc5q7r的公共项目&#xff0c;先创…

Spring CompositeCacheManager融合缓存

这是一个非常实用但容易被忽视的组件,它在特定的缓存场景下能提供极大的灵活性。 1. 核心概念:它是什么? ​​CompositeCacheManager​​ 是 Spring Framework 缓存抽象(spring-context模块)的一部分。它的核心作用正如其名——​​组合(Composite)​​。 它本身并不…

无懈可击的 TCP AIMD

不特指 TCP AIMD&#xff0c;而泛指控制范畴的所有 Additive Increase / Multiplicative Decrease 算法&#xff0c;继 难以超越的 TCP AIMD 再叙。 “你永远不能仅凭 BBR 的吞吐更高就说 BBR 比 CUBIC 更好” 这句话怎么总是没人看&#xff0c;这句话是这一系列文章的前提论点…

数据集数量与神经网络参数关系分析

1. 理论基础 1.1 经验法则与理论依据 神经网络的参数量与所需数据集大小之间存在重要的关系&#xff0c;这直接影响模型的泛化能力和训练效果。 经典经验法则10倍法则&#xff1a;数据样本数量应至少为模型参数量的10倍 公式&#xff1a;数据量 ≥ 10 参数量适用于大多数监督学…

项目经验处理

订单取消和支付成功并发问题 这是一个非常经典且重要的分布式系统问题。订单取消和支付成功同时发生&#xff0c;本质上是一个资源竞争问题&#xff0c;核心在于如何保证两个并发操作对订单状态的修改满足业务的最终一致性&#xff08;即一个订单最终只能有一种确定的状态&…

rabbitmq学习笔记 ----- 多级消息延迟始终为 20s 问题排查

问题现象 在实现多级延迟消息功能时&#xff0c;发现每次消息延迟间隔始终为20s&#xff0c;无法按照预期依次使用20s→10s→5s的延迟时间。日志显示每次处理时移除的延迟时间都是20000L。 问题代码片段 1.生产者 Testvoid sendDelayMessage2() {List<Long> expireTimeLi…

软件测试(三):测试流程及测试用例

1.测试流程1.需求分析进行测试之前先阅读需求文档&#xff0c;分析指出不合理或不明确的地方2.计划编写与测试用例测试用例用例即&#xff1a;用户使用的案例测试用例&#xff1a;执行测试的文档作用&#xff1a;用例格式&#xff1a;----------------------------------------…

Python:列表的进阶技巧

列表&#xff08;list&#xff09;作为 Python 最常用的数据结构之一&#xff0c;不仅能存储有序数据&#xff0c;还能在推导式、函数参数传递、数据处理等场景中发挥强大作用。下面介绍一些进阶技巧与常见应用。一、去重与排序1、快速去重&#xff08;不保序&#xff09;nums …

【完整源码+数据集+部署教程】硬币分类与识别系统源码和数据集:改进yolo11-SWC

背景意义 随着经济的发展和数字支付的普及&#xff0c;传统硬币的使用逐渐减少&#xff0c;但在某些地区和特定场合&#xff0c;硬币仍然是重要的支付手段。因此&#xff0c;硬币的分类与识别在自动化支付、智能零售和物联网等领域具有重要的应用价值。尤其是在银行、商超和自助…