「从URL到网页🌏」构建计算机网络知识体系-03

简介: 「从URL到网页🌏」构建计算机网络知识体系-03

image.png


大家好,我是速冻鱼🐟,一条水系前端💦,喜欢花里胡哨💐,持续沙雕🌲,是隔壁寒草🌿的好兄弟。


欢迎小伙伴们加我微信:sudongyuer拉你进群,一起讨论,期待与大家共同成长🥂。


阅读本文 📖



1.您将了解到输入URL到浏览器展示内容的网络全貌

2.对计算机网络有个宏观的认识

3.用宏观的角度去了解计算机网络,构建计算机网络知识体系,鱼鱼将会一章章跟新

4.对基础知识充满了兴趣和爱好,培养自己对计算机的兴趣


前言 🌵



学习了很长时间的计算机网络,我发现计算机网络是非常有意思的一个课题,但是它的知识面广而深,通过学习我发现,很多书都是深入某一部分去讲解,未免让人失去兴趣,从URL到浏览器展示画面能够让我们全面的了解到网络的从零到一

知识点 📒



创建套接字


先来看看协议栈内部结构


image.png

应用程序使用的都是操作系统提供的上层抽象库Socket,Socket库是由操作系统提供的,里面分了很多程序组件,上文中提到的DNS解析发送数据包就是通过UDP模块发送的。


浏览器、邮件等一般应用程序收发数据时是使用的TCP;


DNS查询等收发较短的控制数据,和具有实效性数据时使用UDP。


IP协议控制网络包的收发操作,在互联网上传输数据时,数据会被切分成一个个的网络包,IP协议就负责传输它们。


IP中包括ICMP协议和ARP协议。


ICMP:用于告知网络包传输过程中是否产生错误,以及各种控制信息。

ARP:用于查询IP地址所对应的MAC地址,一般都是谁是XXXIP你的,类似广播的方式📢

IP下面就是网卡驱动程序,负责控制网卡硬件。网卡负责实际的收发操作。


协议栈,协议栈内部是根据套接字中记录的控制信息来工作的,协议栈内部有一块内存是保存控制信息的内存空间,这里记录了通信操作的控制信息,例如IP地址、端口号、通信操作的进行状态。


使用netstat可以查看套接字内容


套接字中的内容


image.png


控制信息就是套接字实体,或者说控制信息的内存空间就是套接字实体。


浏览器通过socket库像协议栈委托操作。


首先创建套接字,应用程序调用socket程序组件申请创建套接字。


然后就会在内存中开辟一块空间用来保存控制协议,这个就是套接字。


创建套接字时,首先先分配一个套接字所需的内存空间,然后向其中写入初始状态。


image.png


图中这个描述符就是用于计算机内部区分多个套接字的号码牌,端口号是用于网络中确定对方端口号的标识


连接服务器


创建好套接字之后,应用程序就会调用connect,随后协议栈就会将本地的套接字与服务器的套接字进行连接。


这里的连接实际就是值得客户端和服务器交换控制信息,记录一些收发数据需要的数据。

控制信息也分两类:


1.是客户端和服务器相互联络时交换的控制信息。这些信息不仅连接时需要,包括数据收发和断开连接操作在内,整个通信过程都需要。


tcp头部格式


image.png

2.控制信息还有一类,那就是保存在套接字中,用来控制协议栈操作的信息。


image.png

建立连接


创建好套接字以后,开始建立连接,应用程序调用Soket库中的connect开始

connect(<描述符>,<服务器IP地址和端口号>)


这些信息会交给TCP模块,TCP模块会和服务器的TCP模块开始交换这些信息,交互过程包含以下几个步骤。


1.首先客户端创建开始数据收发操作的控制信息的头部(重点是发送方和接受方的端口号),通过TCP头部中的发送方和接收方端口号就可以找到要连接的套接字。


2.TCP创建好了以后,TCP模块会将信息交给IP模块并委托它发送出去,IP模块执行网络包发送操作后,服务器IP模块收到了数据包后会讲数据包交给TCP模块,服务器的TCP模块会根据TCP头部中的信息找到端口号所对应的套接字,并写入相应的控制信息,并将状态改为正在连接。然后服务器TCP模块会返回响应以及SYN比特。返回响应时还要将ACK控制位设置为1,表示已经接收到了响应的网络包。ACK就是用于双方确定网络包是否送达的,客户端收到了这个网络包后会向套接字写入服务器IP地址和端口号等信息,还会将连接状态改为连接完毕。到这里客户端的操作就已经完成了,但其实还差一步就是发送一个响应包表示接受到了上次服务端发送的包,并将ACK为比特设置为1,服务端收到这个包后,连接操作才算全部完成!然后套接字就进入了随时可以发送收据的状态了,就相当于一根管子把两个套接字连接起来了


image.png

收发数据



当连接建立好了以后,就可以开始愉快的收发数据了调用Scoket库中的write组件,write组件将要发送的数据交给协议栈,协议栈并不关心要发送的数据是什么内容,因为数据只是一定长度的二进制字节序列而已。


协议栈并不是收到数据就立即发送的,而是会将数据保存在内部的发送缓冲区,并等待应用程序的下一段数据。为什么呢,因为应用程序一次将多少数据传递给协议栈是应用程序控制的,为了控制网络传输效率。


当数据积累到一定量时再发送出去,至于积累多少数据,不同的操作系统不同。但有几个要素来判断。


1.网络包能容纳的数据长度MTU(最大传输单元),在以太网中一般是1500字节。MTU包含头部的总长度。MSS(最大分段大小)就是除去头部一个网络包最大能容纳的数据长度。


白话来说,MTU就是整个网络包的大小包含各种头部(IP头->数据)


MSS就是纯数据的大小(TCP分段)


2.另一个要素是时间要素。当应用程序发送数据的频率不高时,如果每次都等到长度接近MSS时再发送,等待时间就会太长,导致发送延迟,这种情况即便缓冲区没有到达MSS,也应该果断发送出去,因此协议栈内部有一个定时器,当经过一定时间后就会把网络包发送出去。(毫秒级别的)


⚠️当然这两者时矛盾的,协议栈也给应用程序流了控制发送时机的余地,应用程序在发送数据可以指定一些选项来控制,浏览器一般采用的是直接发送的选项。


image.png


对较大的数据进行拆分


HTTP请求消息一般不大,但是当我们提交表单数据的时候,数据的大小可能MSS,这时候我们就需要拆分数据包了,会按照MSS的长度拆分,拆分出来的数据会被放入单独的网络包。当需要发送这些数据时,就会在每一块数据前面加上TCP头部,并根据套接字中记录的控制信息标记发送方的端口号,然后交给IP模块来执行发送数据的操作。


image.png

一般应用程序的数据都比较大,因此TCP会按照网络包的大小对数据进行拆分。


这样我们的包就发送出去了,但数据发送的操作还没结束,TCP具备确认对方是否成功收到了网络包,以及到网络包未成功到达目标计算机时进行重发的功能,因为TCP还需要进行确认操作。

image.png


每个数据包发送的时候都会带上序列号和长度,通过这些信息就能够检查网络包是否有遗漏。


实际情况中序列号不是从一开始的,这样很容易被人猜出来发动攻击。还记得我们在建立连接时SYN设置为1的同时,还需要同时设置序列号字段,这个序列号就代码序号的初始值。

image.png


通过序号和ACK号就可以确认接受方是否收到了网络包


image.png


滑动窗口


如果我们发送一个包就等待一个ACK号,这种方式太浪费了。为了减少这样的浪费,TCP采用滑动窗口来管理数据的发送和ACK号的操作,所谓滑动窗口就是在发送一个数据包之后,不用等待ACK号的返回,而是直接发送后续的一系列包。这样等待ACK号的时间就能杯有效利用起来了。


image.png


当接收方的 TCP 收到包后,会先将数据存放到 接收缓冲区中。然后,接收方需要计算 ACK 号,将数据块组装起来还原 成原本的数据并传递给应用程序,如果这些操作还没完成下一个包就到了也不用担心,因为下一个包也会被暂存在接收缓冲区中。如果数据到达的 速率比处理这些数据并传递给应用程序的速率还要快,那么接收缓冲区中 的数据就会越堆越多,最后就会溢出。缓冲区溢出之后,后面的数据就进 不来了,因此接收方就收不到后面的包了,这就和中途出错的结果是一样 的,也就意味着超出了接收方处理能力


如果避免缓冲区溢出呢,那么接受方需要告诉发送方自己最能多接受多少数据,然后发送发方根据这个数据控制发送数据操作。这就是滑动窗口的基本思路。


接受方缓冲区能够接收的最大数据量为窗口大小(它是 TCP 调优参数 中非常有名的一个)


image.png

通过ACK 与通知更新窗口的包的合并来减少数据包的频繁发送,可以将ACK包和通知窗口更新的数据放在一个数据包发送,也可以将多个ACK合并成最后一次ACK

到这里我们的数据就从客户端发送到了服务端,接下来还要等待WEB服务器返回响应消息。然后我们将返回的数据包存放在接受缓冲区,并将数据块按顺序连接起来还原出原始的数据,最后将数据交给应用程序。具体来说,协议栈会将接收到的数据复制到应用程序指定的内存地址中,然后将控制流程交回应用程序。将数据交给应用程序之后,协议栈还需要找到合适的时机向发送方发送窗 口更新。


总结 🍁


  • 创建套接字
  • 建立连接设置序列号
  • 通过滑动窗口来控制发送方数据收发
  • 将接收的数据存放在缓冲区
  • 将缓冲区数据交给应用程序时更新窗口大小


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
11月前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
215 9
|
7月前
|
API Kotlin
动态URL构建与HTTP请求的Kotlin实现
动态URL构建与HTTP请求的Kotlin实现
|
11月前
|
人工智能 自然语言处理
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
WebDreamer是一个基于大型语言模型(LLMs)的网络智能体框架,通过模拟网页交互来增强网络规划能力。它利用GPT-4o作为世界模型,预测用户行为及其结果,优化决策过程,提高性能和安全性。WebDreamer的核心在于“做梦”概念,即在实际采取行动前,用LLM预测每个可能步骤的结果,并选择最有可能实现目标的行动。
261 1
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
|
缓存 网络协议 CDN
在网页请求到显示的过程中,如何优化网络通信速度?
在网页请求到显示的过程中,如何优化网络通信速度?
301 59
|
11月前
|
Java 开发者
JAVA高手必备:URL与URLConnection,解锁网络资源的终极秘籍!
在Java网络编程中,URL和URLConnection是两大关键技术,能够帮助开发者轻松处理网络资源。本文通过两个案例,深入解析了如何使用URL和URLConnection从网站抓取数据和发送POST请求上传数据,助力你成为真正的JAVA高手。
219 11
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
468 7
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
11月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
网络协议 前端开发 JavaScript
浏览器加载网页的幕后之旅:从URL到页面展示详解
【8月更文挑战第31天】当在浏览器地址栏输入URL并回车后,一系列复杂过程随即启动,包括DNS解析、TCP连接建立、HTTP请求发送、服务器请求处理及响应返回,最后是浏览器页面渲染。这一流程涉及网络通信、服务器处理和客户端渲染等多个环节。通过示例代码,本文详细解释了每个步骤,帮助读者深入理解Web应用程序的工作机制,从而在开发过程中作出更优决策。
306 5
|
安全 Java 网络安全
【认知革命】JAVA网络编程新视角:重新定义URL与URLConnection,让网络资源触手可及!
【认知革命】JAVA网络编程新视角:重新定义URL与URLConnection,让网络资源触手可及!
121 2
|
监控 安全 Apache
构建安全的URL重定向策略:确保从Web到App平滑过渡的最佳实践
【10月更文挑战第2天】URL重定向是Web开发中常见的操作,它允许服务器根据请求的URL将用户重定向到另一个URL。然而,如果重定向过程没有得到妥善处理,可能会导致安全漏洞,如开放重定向攻击。因此,确保重定向过程的安全性至关重要。
510 0