计网笔记(三)

news/2024/7/24 8:32:32

1传输层知识

传输层是只有计算机才有的层次,主要提供是进程间逻辑通信 + 可靠传输或者不可靠的功能。

这里简单说一下可靠传输协议TCP + 不可靠传输协议UDP。

TCP面向连接,可靠,不提供广播和多播,而且时间延迟比较大,适用于大文件传输。 UDP无连接,收到的报也不确认,但时间延迟小,适用于小文件。

1.1端口号

端口号可以用来标识同一个主机上通信的不同应用程序(就是哪个应用程序在使用这个端口)。

1.2UDP协议

UDP协议是参考模型中一种无连接的传输层协议,提供面向事务简单不可靠信息传送服务。

1.2.1UDP特点

UDP是无连接的,减少开销和发送数据之前的时间延迟。大家都知道TCP的三次握手和四次分手,这个是需要时间花销的,但是UDP没有这部分花销。

UDP使用最大努力交付,即不保证可靠交付。那谁来保证可靠的交付呢?是由UDP的上一层协议,应用层来保证

UDP是面向报文的,适合一次性传输少量数据的网络应用。什么意思呢,如下图,UDP这层,把应用层的全部内容作为自己的数据报部分,在IP层也只是加了一个IP首部,我们知道,在以太网,链路层上的数据如果超过1500字节,就会分片,所以网络层发现上面传输层给了太大的数据就会分片,加上UDP是不可靠的协议,这就加大了UDP的不可靠性,容易丢失,所以UDP适合数据量少的。

UDP首部较小,只有8字节,而TCP由20字节。这也是减少网络传输开销的一方面。

1.3 TCP协议

TCP协议简单来说是一种位于传输层的,面向连接的可靠的基于字节流的传输层通信协议。

TCP是面向连接的传输层协议。比如说TCP的三次握手,四次分手,针对的都是连接。

每一条TCP连接只能有两个端点,每一条TCP连接是点对点的。也就是说TCP是不同计算机之间的进程的通信。

TCP提供可靠交付的服务,无差错,不丢失,不重复,按序到达。总结一下就是,可靠有序,不丢不重

TCP提供全双工通信。全双工指的是连接双方可以同时收发数据。在收发两端都有发送缓存和接收缓存,发送缓存就是一个准备发送的队列,接收缓存是一个准备接收的队列。

TCP面向字节流。以字节为单位发送。
6位控制位
在这里插入图片描述

1.3.1TCP建立连接

在这里插入图片描述

  • 首先,客户端向服务器发送请求数据包,请求与服务器建立链接,将SYN=1。
  • 服务器收到请求后为此次TCP链接分配缓存和变量(接受,发送缓存队列),并向客户端返回确认报文,其中SYN=1表示允许建立链接,ACK=1表示确认收到来自对方的数据包。
  • 客户端收到服务器的确认报文后,也分配缓存和变量(接受,发送缓存队列)。最后客户端向服务器发送一个确认报文,SYN=0,表示这个报文不是请求连接的报文了,接下来要发送数据了,ACK=1,表示收到服务器的确认请求了。

1.3.2TCP释放连接

在这里插入图片描述

  • 客户端向服务器发送断开连接请求,其中,FIN=1。
  • 服务器收到来自客户端的请求后,返回确认报文,ACK=1。此时,客户端不能再向服务器发送信息报文,只能接受来自服务器的报文。
  • 当服务器发送完要发送的信息后,便向客户端发送释放连接的报文,FIN=1,ACK=1。
  • 客户端收到报文后,返回确认报文,ACK=1。在发送完毕后,客户端进入等待状态,等待两个周期(2MSL,最长报文寿命时间)后,链接自动断开。

为什么还要等待两个周期呢?

当客户端向服务器发送完断开连接的确认报文后,若服务器没有收到该报文,就会超时重传一个断开连接的报文,然后客户端再返回一个确认报文。等待两个周期是为了防止服务器没有正常收到客户端的确认报文。

为什么连接的时候是三次握手,关闭的时候却是四次握手?

当服务器收到来自客户端的FIN报文时,服务器不一定就马上关闭连接,如果服务器还有数据未发送完,服务器先返回ACK报文,然后继续发送数据。等到数据发送完成,再向客户端发送FIN报文,客户端返回确认报文。因此就比建立链接时多出来一次。

为什么不能用两次握手进行连接?

  • 若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。
  • 此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据
  • 但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源
  • 但我觉得这个只是两次握手可能造成的问题,最关键的是两次握手有服务器对客户端的起始序列号做了确认,但客户端却没有对服务器的起始序列号做确认,不能保证传输的可靠性。

http://www.niftyadmin.cn/n/861510.html

相关文章

JS数组的常用方法

1.splice() !注意:splice函数会改变原数组。 由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组 例子 1 在本例中,我们将创建一…

Avoid using non-primitive value as key, use string/number value instead.

在使用v-for的时候,控制台报错,Avoid using non-primitive value as key, use string/number value instead. 主要是原因是key用的不对, key是要唯一性的,所以应该用循环的数据里面唯一的来做,比如id,如下,…

Sorry, name can no longer contain capital letters.

在使用vue-cli脚手架,vue命令创建项目的时候,报这个错,Sorry, name can no longer contain capital letters.,原因是因为创建的项目名称里面包含了,大写的字母,所以需要把大写字母改成小写的就可以了

手写JS深拷贝

1.使用JSON.stringify,JSON.parse 该方法只能拷贝Object对象,而无法拷贝undefined,function,RegExp等。 function deepCopy1(obj) {// 使用JSON.stringify,JSON.parselet objString JSON.stringify(obj);return JSO…

npm 安装 chromedriver@2.46.0失败

在创建vue项目的时候提示chromedriver2.46.0安装失败 这个时候我们应该,单独安装一次 npm install chromedriver --chromedriver_cdnurlhttp://cdn.npm.taobao.org/dist/chromedriver

小红书2020前端

1.薯队长写了一篇笔记草稿&#xff0c;请你帮忙输出最后内容。 1.输入字符包括&#xff0c;"(" , “)” 和 "<“和其他字符。 2.其他字符表示笔记内容。 3.()之间表示注释内容&#xff0c;任何字符都无效。 括号保证成对出现。 4.”<“表示退格, 删去前面…

无法加载文件 D:\node.js\node_global\vue.ps1,因为在此系统中禁止执行脚本。有关详细信息,请参阅 “get-help about_signing“。因为在此系统中禁止执行脚

vue脚手架新建项目报错 PS C:\Users\Administrator\Desktop\test> vue init webpack test 无法加载文件 D:\node.js\node_global\vue.ps1&#xff0c;因为在此系统中禁止执行脚本。有关详细信息&#xff0c;请参阅 "get-help about_signing"。 所在位置 行:1 字符…

ES6中class类继承的实现

转自https://es6.ruanyifeng.com/#docs/class-extends 大多数浏览器的 ES5 实现之中&#xff0c;每一个对象都有__proto__属性&#xff0c;指向对应的构造函数的prototype属性。Class 作为构造函数的语法糖&#xff0c;同时有prototype属性和__proto__属性&#xff0c;因此同时…