| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 网络是怎样连接的(以访问网页为例)第一篇章(重点)——客户端出发点 -> 正文阅读 |
|
[网络协议]网络是怎样连接的(以访问网页为例)第一篇章(重点)——客户端出发点 |
目录生成HTTP请求消息网址(URL)的输入浏览器是一个具有多种客户端功能的综合性客户端软件,因此需要各种各样的URL来判断应该使用其中哪种功能的综合性客户端软件。 URL开头文字,即:“http:” “tfp:” “file” …表示的是浏览器应当使用的访问方法。 浏览器解析URL(以访问web服务器为例)浏览器第一步工作就是解析URL,从而生成发送给web服务器的请求消息。 使用HTTP协议来访问web服务器
HTTP协议定义了客户端和服务器之间交互的消息内容和操作方法 当上述的请求消息发送出去之后,web服务器会返回响应消息 向DNS服务器查询web服务器的IP地址TCP/IP网络是通过IP地址来确定通信对象的。 TCP/IP的基本思路:由一些小的子网,通过路由器连接起来组成一个大的网络。 子网可以理解为用集线器连接起来的几台计算机。 IP地址IP地址:一串32bit的数字,按照8bit为一组分为4组,常见IP地址是用十进制表示的。 域名和IP地址并用的理由TCP/IP网络是通过IP地址来确定通信对象的。 网址中不写服务器名字,直接写IP地址??? 不用IP地址,用名称来确定通信对象??? Socket库提供查询IP地址的功能查询IP地址的方法非常简单,只要询问最近的DNS服务器就可以了,DNS服务器会将目标IP地址返回请求方。 有Web服务器,就有主机客户端。同理对于DNS服务器,就有DNS客户端。DNS解析器就相当于DNS客户端。DNS解析器是一段程序,它包含在操作系统的Socket库中。Socket库是 用于调用网络功能的程序组件集合。 工作流程: 向DNS服务器发送消息时,当然也需要事先知道DNS服务器的IP地址,不过这个IP地址是事先设置好的,不需要去查询。 DNS服务器之间的查询操作: 委托协议栈发送消息知道了IP地址之后,就可以委托操作系统内部的协议栈向目标IP地址,也就是我们要访问的web服务器发送消息了。和向DNS服务器查询IP地址的操作一样,这里也需要使用Socket库中的程序组件。 协议栈结构: 什么是套接字在进行收发数据操作之前,双方需要先建立起这条管道才行。建立管道的关键在于管道两端的数据出入口,这些出入口称为套接字。 套接字只是一个概念,并不存在实体,但我们可以把套接字理解为具有各种各样通信控制信息(例如IP地址、端口号、通信操作的进行状态)的通信出入口。 综上所述:收发数据的操作分为若干个阶段,可以大致总结为以下4个阶段: 创建套接字(打开数据出入口)客户端创建套接字就是调用Socket库中的socket程序组件,和调用解析器一样。创建套接字时,首先分配一个套接字所需的内存空间,然后向其中写入初始状态。 连接阶段(将双方数据出入口相连——三次握手)在双方套接字刚刚创建完成的时候,里面并没有存放任何数据,也不知道通信的对象是谁。 连接阶段的任务: 实际过程三次握手:参考博客: https://blog.csdn.net/baiyan3212/article/details/81302448. 第二次握手: 服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s)。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 的状态。 第三次握手: 客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。 为什么要三次握手?第一次握手:客户端发送网络包,服务端收到了。 三次握手过程中可以携带数据吗第三次握手时可以携带数据,但是第一、二次不行。 原因:设想这样的场景:若第一次握手可以携带数据,有人要恶意攻击服务器,则他每次都可以在第一次握手中的SYN报文中放入大量数据,会让服务器花费很多时间、空间来处理报文。 也就是说:第一次握手无法放数据,保证了服务器的安全性。而第三次握手时,已经代表成功的建立了连接,从客户端携带数据到服务器也是被理解的。 通信阶段(根据通道进行数据交换)序号与ack号用法图中ACK表示的是确认编号。 使用窗口有效管理ack号每发一个包就等待一个ack号,在等待ack号的这段时间中,如果什么都不做那实在太浪费了,为了减少浪费,TCP采用窗口滑动方式来管理数据发送和ack号。即:发送一个包之后,不等待ack号返回,而是直接发送后续的一系列包。 断开管道并删除套接字(断开通道和出入口——四次挥手)为什么建立一个连接要三次握手,而终止需要四次呢?这是由TCP的半关闭造成的。即,TCP提供了连接的一段在结束它的发送后还能接收来自另一端数据的能力。 假设客户端先发起关闭请求: 第一次挥手: 客户端发送一个FIN报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态。 第二次挥手: 服务器收到FIN后,会发送ACK报文,且把客户端序列号值+1作为ACK报文的序列号值,表示已经收到客户端的报文了,此时服务器处于CLOSE_WAIT状态。 第三次挥手: 如果服务器也想断开连接了,发送FIN报文,并且由于这是对于回应报文,因此确认标志ACK仍需置1,服务器端处于LAST_ACK状态 第四次挥手: 客户端收到FIN后,发送一个ACK作为应答,此时客户端处于TIME_WAIT2状态,而服务端收到ACK报文后,就处于CLOSED状态 挥手为什么需要四次当服务器端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”,只有等我服务端所有的报文都发送完毕, 我才能发送FIN报文。 等待2MSL的意义MSL译为“最长报文段寿命”,是任何报文在网络上存在的最长时间,超过这个时间,报文将被丢弃。 理由一:保证客户端发送的最后一个ACK报文段能够到达服务端。 若客户端发送的最后一个ACK报文段在传输过程丢失,服务器接受不到回应,会启动超时重传机制,超时重传FIN-ACK。接下来客户端再重传一次确认,重新启动等待计时器。最后客户端和服务器都正常关闭。 理由二:防止“已失效的连接请求报文段”出现在本连接中 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 2:03:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |