网络原理之TCP_IP

目录

应用层重点协议

传输层重点协议

1.UDP协议

(一)UDP协议段格式

 (二)UDP的特点

无连接

不可靠传输

面向数据报

全双工

缓冲区

大小受限

(三)基于UDP的应用层协议

(四)面试题

2.TCP协议 

(一)TCP协议段格式

 (二)TCP的特点

有连接

可靠传输

面向字节流

缓冲区

全双工

粘包问题

异常情况

(三)基于TCP应用层协议

​编辑网络层重点协议

IP协议

数据链路层重点协议

面试题


 

我们知道TCP/IP五层(或四层)模型包括:

  • 应用层
  • 传输层
  • 网络层
  • 数据链路层
  • 物理层

那网络传输是怎样具体展开的呢~

举个例子(发送方“封装”)(接收方要“分用”)

 

下面我们就来学习各个层的重点协议~~ 

 应用层重点协议

传输层重点协议

1.UDP协议

(一)UDP协议段格式

  • 16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度
  • 如果校验和出错,就会直接丢弃        
 (二)UDP的特点
无连接

知道对方的IP号和端口号就能直接进行传输,不需要建立连接

不可靠传输

没有任何安全机制,发送端发送数据报后,如果遇到网络故障该段无法发送过去,UDP协议层也不会给应用层返回任何错误信息

面向数据报

应用层发给UDP多长的报文,UDP原样发送,既不会拆分也不会合并

全双工

UDP的socket既能读也能写

缓冲区

UDP只有接收缓冲区,没有发送缓冲区

UDP没有真正意义上的 发送缓冲区。发送的数据会直接交给内核,由内核将数据传给网络层协议 进行后续的传输动作;

UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一 致;如果缓冲区满了,再到达的UDP数据就会被丢弃;

大小受限

UDP协议首部中有一个16位的最大长度。也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。

(三)基于UDP的应用层协议
  • NFS:网络文件系统
  • TFTP:简单文件传输协议
  • DHCP:动态主机配置协议
  • BOOTP:启动协议(用于无盘设备启动)
  • DNS:域名解析协议

当然,也包括你自己写UDP程序时自定义的应用层协议。

(四)面试题

1. UDP本身是无连接,不可靠,面向数据报的协议,如果要基于传输层UDP协议,来实现一个可靠传 输,应该如何设计?

2. UDP大小是受限的,如果要基于传输层UDP协议,传输超过64K的数据,应该如何设计? 

以上两个问题答案类似,都可以参考TCP的可靠性机制在应用层实现类似的逻辑:

例如:

  • 引入序列号,保证数据顺序;
  • 引入确认应答,确保对端收到了数据;
  • 引入超时重传,如果隔一段时间没有应答,就重发数据;
  • …… 

2.TCP协议 

(一)TCP协议段格式

 (二)TCP的特点
有连接

在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接

那啥叫断开连接呢? 

A和B把自己存储的连接信息(数据结构)删了,连接就是断开了~~

三次握手:

建立连接阶段,主要认识两个状态:

1.LISTEN 服务器的状态

表示服务器已经准备就绪,随时可以跟客户端来建立连接,相当于手机开机,信号良好,随时可以有人来打电话~~

2.ESTABLISHED 客户端和服务器都有

表示连接建立完成,接下来就可以正常通信了,相当于电话拨过去,对方接通了~~ 

  

四次挥手:

 

 断开连接阶段,主要认识两个状态:

1.TIME_WAIT

TIME_WAIT表示要保持当前的TCP连接状态不要立即就释放~

为什么不要连接释放呢?

TIME_WAIT如果等待了一段时间后也没收到重传的FIN,此时就认为,最后的一个ACK没丢,于是就彻底的释放连接了~

2.CLOSE_WAIT 出现在被动发起断开连接的一方

建立连接一定是客户端主动发起请求的,断开连接,可能是客户端主动发起,也可能是服务器主动发起~

CLOSE_WAIT表示等待关闭,等待调用close方法关闭socket

有连接和确认应答的区别:

可靠传输

确认应答机制

网络后发先至这个现象是客观存在的,如何解决这个问题呢?

方法很简单,给传输的数据和应答报文,都进行编号就可以了!!!

TCP将每个字节的数据都进行了编号。即为序列号。

每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发。

超时重传机制

主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B;如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发;

如果一直丢包,主机A会一直重传吗?

答案是不会的~

但是,主机A未收到B发来的确认应答,也可能是因为ACK丢失了;

由于主机B返回的确认应答因网络堵塞等原因在传输的途中丢失,没有到达主机A,主机A会等待一段时间,若在特定时间间隔始终未能收到确认应答,主机A会对此数据进行重发,此时,主机B将第二次发送已接收数据的确认应答,由于主机B已经收到过1~1000的数据,当再有重复数据送达时它会放弃~~

滑动窗口机制

刚才我们讨论了确认应答策略,对每一个发送的数据段,都要给一个ACK确认应答。收到ACK后再发送 下一个数据段。这样做有一个比较大的缺点,就是性能较差。尤其是数据往返的时间较长的时候

既然这样一发一收的方式性能较低,那么我们一次发送多条数据,就可以大大的提高性能(其实是将多 个段的等待时间重叠在一起了)

 当批量发送了窗口大小的这些数据之后,发送方就要等待ACK了

那么啥时候继续往下发送呢?发送方不是等待所有的ack到达才继续往下发,而是到了一个ack,就继续往下发一条...

如上图的例子,那么我们等待的ack始终是4条~

 那么如果出现了丢包,如何进行重传?这里分两种情况讨论。

情况一、数据包丢了

情况二、ack丢了

 流量控制机制

这是一种干预发送窗口大小的机制

滑动窗口越大,传输效率越高(一份时间,等待的ack越多)

但是,窗口也不能无限的大~否则会造成以下的问题:

1.完全不等ack,可靠性能否保障画上问号

2.窗口越大,也会消耗大量的系统资源

3.发送速度太快,接收方处理不过来,发了也白发

接收方的处理能力,就是一个很重要的约束依据

发送方发数据的速度,不能超过接收方的处理能力

流量控制要做的工作就是这个,根据接收方的处理能力,协调发送方的发送效率

那如何衡量接收方的处理能力?

其实可以直接看接收方接收缓冲区的剩余大小~

当窗口大小为0,发送方就要暂停发送,暂停发送的等待过程中,会给B定期发送窗口探测报文,这个报文不携带具体的业务数据,只是为了触发ack查询窗口大小~~

延时应答机制

 

面向字节流
缓冲区

创建一个TCP的socket,同时在内核中创建一个 发送缓冲区 和一个 接收缓冲区;

前面我们说过~网络上的传输可能后发先至

TCP使用这个接收缓冲区,对接收的数据进行重新排序,使应用程序read到的数据是保证有序的(和发送顺序一致)

全双工

既可以读数据,也可以写数据。

粘包问题

首先要明确,粘包问题中的 "包" ,是指的应用层的数据包。

在TCP的协议头中,没有如同UDP一样的 "报文长度" 这样的字段,但是有一个序号这样的字 段。

站在传输层的角度,TCP是一个一个报文过来的。按照序号排好序放在缓冲区中。

站在应用层的角度,看到的只是一串连续的字节数据。 

那么应用程序看到了这么一连串的字节数据,就不知道从哪个部分开始到哪个部分,是一个 完整的应用层数据包。

那么如何避免粘包问题呢?

归根结底就是一句话,明确两个包之间的边界。

对于定长的包,保证每次都按固定大小读取即可;

就从缓冲区从头开始按sizeof()依次读取即可;

对于变长的包,可以在包头的位置,约定一个包总长度的字段,从而就知道了包的结束位 置;

对于变长的包,还可以在包和包之间使用明确的分隔符(应用层协议,是程序猿自己来定 的,只要保证分隔符不和正文冲突即可);

异常情况

(三)基于TCP应用层协议
  • HTTP
  • HTTPS
  • SSH
  • Telnet
  • FTP
  • SMTP
  • 当然,也包括你自己写TCP程序时自定义的应用层协议;

网络层重点协议

IP协议

协议头格式如下:

4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4。

4位头部长度(header length):IP头部的长度是多少个32bit,也就是 length * 4 的字节 数。4bit表示最大的数字是15,因此IP头部最大长度是60字节。

8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留 字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。 这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于 ftp这样的程序,最大吞吐量比较重要。

16位总长度(total length):IP数据报整体占多少个字节。

16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每 一个片里面的这个id都是相同的。

16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏。

32位源地址和32位目标地址:表示发送端和接收端。

 举个例子:

 

我们来想一个问题~如果IP地址不够用了怎么办?

1.动态分配IP地址。此时就可以省下一大批IP地址了,但是这个方案没有从根本上增加IP地址,只是提高了利用率,治标不治本~

2.NAT网络地址转换,本质是使用一个IP地址代表一批设备,使用端口号区分,能够大大提高IP地址的利用率

3.IPv6 (从根本解决IP不够用的问题)

使用16字节,表示IP地址,

特殊的IP地址:

  • 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网
  • 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据
  • 127.*的IP地址用于本机环回测试,通常是127.0.0.1
  • 本机环回主要用于本机到本机的网络通信,(系统内部为了性能,不会走网络的方式传输)

路由选择 

数据链路层重点协议

mac地址是6个字节的(比IPv4地址大很多)当前每个设备都有一个唯一的mac地址,不是动态分配的,而是网卡出厂的时候设置好的

MTU :

面试题

关于网络原理这块知识点,会有一个常考的面试题:

在浏览器输入www.baidu.com并按下回车后,到最终页面展示,涉及了许多网络原理和技术,以下是整个过程的简要步骤:

1. DNS解析:
   - 浏览器首先会将输入的URL解析成IP地址。这个过程称为DNS解析,它通过查询域名系统(DNS)来找到与www.baidu.com相关联的IP地址。

2. 建立TCP连接:
   - 一旦浏览器知道了目标服务器的IP地址,它会尝试与该服务器建立TCP连接。这是通过三次握手过程完成的,包括客户端向服务器发送连接请求,服务器回复确认,然后客户端再次确认。

3. 发起HTTP请求:
   - 一旦建立了TCP连接,浏览器将发起一个HTTP请求,以获取与www.baidu.com关联的网页。这个请求包含了要获取的页面信息,以及其他相关的HTTP头部信息。

4. 服务器处理请求:
   - 目标服务器(www.baidu.com)收到浏览器的请求后,会根据请求的内容和服务器上的配置来处理请求。通常,服务器会生成响应,包括网页内容、状态码和其他HTTP头部信息。

5. 服务器发送HTTP响应:
   - 一旦服务器处理完请求,它会将HTTP响应发送回客户端(浏览器)。这个响应包括HTTP状态码,例如200 OK表示成功,以及请求的网页内容。

6. 浏览器渲染页面:
   - 浏览器接收到HTTP响应后,会解析HTML、CSS和JavaScript代码,然后渲染页面。这包括将HTML结构转化为可见的网页,并加载和执行JavaScript代码以添加交互性和动态内容。

7. 页面展示:
   - 最终,浏览器将完整的网页渲染出来,并将其呈现在用户的屏幕上,用户可以看到和与网页交互。

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

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

相关文章

Python教程——配置环境,再探IDE

文章目录 一、Python安装下载安装验证 二、第一个Python程序常见问题 三、Python解释器四、PyCharm工具安装和配置安装使用PyCharm基本使用 一、Python安装 下载 如果我们想要使用Python语言编写程序,我们必须下载Python安装包并配置Python环境,我们现…

geecg-uniapp 源码下载运行 修改端口号 修改tabBar 修改展示数据

APP体验: http://jeecg.com/appIndex技术官网: http://www.jeecg.com安装文档: 快速开始 JeecgBoot 开发文档 看云视频教程: 零基础入门视频官方支持: http://jeecg.com/doc/help 一,下载安装 源码下载…

C++ 类和对象篇(三) 空类和6个默认成员函数

目录 一、空类 1. 是什么? 2. 空类中的成员 3. 空类的大小 二、6个默认成员函数 三、 构造函数 1. 构造函数是什么? 2. 为什么C要引入构造函数? 四、析构函数 1. 析构函数是什么? 2. 为什么要有析构函数? 五、拷贝构造…

win11安装双系统Ubuntu的坎坷记录

之前一直装的都是在一个硬盘中,这是是两块盘。 我的电脑是惠普暗影精灵8Pro 一 安装前的准备工作 1.1 记得先关闭,Bitlocker 输入wins,搜索框输入:设备加密设置 1.2 BIOS设置 (惠普这电脑是开机时按 F10&#xff0…

SpringCloud(三)Sentinel、Seata、多级缓存

文章目录 Sentinel雪崩问题Sentinel与Hystrixsentinel使用案例限流规则流控模式流控效果热点参数限流 隔离和降级Feign整合Sentinel线程隔离熔断降级 授权规则与规则持续化自定义异常结果规则管理模式 Seata分布式事务问题理论基础CAP定理BASE理论 Seata架构部署TC服务微服务集…

【单片机】16-LCD1602和12864和LCD9648显示器

1.LCD显示器相关背景 1.LCD简介 (1)显示器,常见显示器:电视,电脑 (2)LCD(Liquid Crystal Display),液晶显示器,原理介绍 (3&#xff…

Java实现哈希表

1.哈希表定义 哈希表(hash table,也叫散列表),是根据关键码值(key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这…

浏览器唤起钉钉 各项功能

浏览器唤起钉钉对应人员聊天 文档地址 https://open.dingtalk.com/document/client/unified-routing-protocol 唤起聊天 不过只能唤起叮叮的名片 id为叮叮号 <a href"dingtalk://dingtalkclient/action/sendmsg?dingtalk_id{id}"></a>id&#xff1a; …

maven的pom.xml文件显示被删除

文章目录 1.问题情况2.问题分析3.问题解决 1.问题情况 2.问题分析 这些 pom.xml 文件被 maven 视为了忽略文件。 3.问题解决 路径&#xff1a;File --> Settings --> Build&#xff0c;Execution&#xff0c;Deployment --> Build Tools --> Maven --> Ignor…

06_Node.js服务器开发

1 服务器开发的基本概念 1.1 为什么学习服务器开发 Node.js开发属于服务器开发&#xff0c;那么作为一名前端工程师为什么需要学习服务器开发呢&#xff1f; 为什么学习服务器开发&#xff1f; 能够和后端程序员更加紧密配合网站业务逻辑前置扩宽知识视野 1.2 服务器开发可…

bochs 对 Linux0.11 进行调试 (TODO: 后面可以考虑集成 vscode+gdb+qemu)

我在阅读 Linux0.11 源码时&#xff0c;对一个指令 LDS 感到困惑。 看了下 intel 指令集手册&#xff0c;能猜到 LDS 的功能&#xff0c;但不确定。 于是决定搭建调试环境&#xff0c;看看 LDS 的功能是否真如自己猜测。 首先 make debug 运行 qemu-Linux0.11&#xff0c;命…

基于Java+SpringBoot+Vue在线家具商城系统的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Ubuntu20.04 配置 yolov5_ros 功能包记录

文章目录 本文参考自博主源801,结合自己踩坑后修改 项目地址:https://github.com/mats-robotics/yolov5_ros 1.新建工作空间 新建一个工作空间 yolo_ros(名字可自定义),在 yolo_ros 下新建文件夹 src 并catkin_make进行编译 2. 安装相机驱动,可以选用较为主流的 usb_cam 或…

ios safari 浏览器跳转页面没有自适应

今天开发遇到了一个问题&#xff0c;当用户点击浏览器中的表单进行注册时&#xff0c;表单元素会放大&#xff0c;随后跳转页面无法还原到初始状态。 这是因为如果 的 font-size 被设定为 16px 或更大&#xff0c;那么 iOS 上的 Safari 将正常聚焦到输入表单中。但是&#xff…

2023版 STM32实战8 独立看门狗(IWDG)

IWDG简介 STM32F10xxx内置两个看门狗&#xff0c;提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障。 说人话就是能解决程序跑飞的问题。 编写代码思路 -1- 使用这个功能必须解除写保护 -2-…

FLIP动画做拖拽排序效果

先来看效果 index.html文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content&quo…

Netty深入浅出(无处不在的IO)

为什么要有Netty Netty是为了解决网络编程的复杂性和提供易于使用、高性能和可扩展的框架而开发的。它通过提供一组可重用的组件来处理网络通信的低级细节&#xff0c;例如套接字管理、线程和缓冲&#xff0c;简化了开发网络应用程序的过程。这使开发人员可以专注于应用程序逻…

自然语言处理 | WordNet

WordNet是词汇数据库,即英语词典,专为自然语言处理而设计。 Synset是一种特殊的简单接口,存在于 NLTK 中, 用于在 WordNet 中查找单词。同义词集实例是表达相同概念的同义词的分组。有些单词只有一个同义词集,有些则有多个。

C#对字典容器Dictionary<TKey, TValue>内容进行XML序列化或反序列化报错解决方法

一、问题描述 在使用C#对字典容器Dictionary<TKey, TValue>内容进行XML序列化报错【System.Exception:“不支持类型 System.Collections.Generic.Dictionary2[[System.String, mscorlib, Version2.0.0.0, Cultureneutral, PublicKeyTokenb77a5c561934e089],[System.Strin…

基于matlab统计Excel文件一列数据中每个数字出现的频次和频率

一、需求描述 如上表所示&#xff0c;在excel文件中&#xff0c;有一列数&#xff0c;统计出该列数中&#xff0c;每个数出现的次数和频率。最后&#xff0c;将统计结果输出到新的excel文件中。 二、程序讲解 第一步&#xff1a;选择excel文件&#xff1b; [Filename, Pathn…