《网络是怎样连接的》读书笔记1\2\6章

文章目录


〇、一些常识:

1.网络体系架构:

TCP/IP架构就是IP、TCP、HTTP、TELNET、SNMP等协议的集合
主要用于互联网和局域网
由于其应用广泛
可以说,互联网协议 就是 TCP/IPTCP/IP 就是 互联网协议

除此之外,还有一些网络体系架构:
比如:
AppleTalk 用于苹果公司现有产品的局域网(仅限苹果公司设备使用)
IPX/SPX:用于个人电脑局域网等

2.TCP/IP架构的历史:

美国国防部希望有这样一种通讯系统:
即使某处线路遭到攻击,也可以用迂回的方式保持通讯。
分组交换技术,使得多个用户同一时间共享一条线路。(ARPANET)
UNIX操作系统 使TCP/IP 广泛被接受。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.分享一个生动的小故事:

作者:车小胖
链接:https://www.zhihu.com/question/66528743/answer/250078635
来源:知乎

据不可靠消息,杨贵妃不仅爱吃荔枝,还爱吃海南岛的香蕉,
为了让爱妃吃得开心,皇上命令大臣日夜兼程从海南岛运香蕉到长安。
香蕉如何从海南岛运到长安呢?
首先,要用船将香蕉运出岛,运到广东的码头。
然后从广东码头,士兵快马加鞭运香蕉向西北方向奔去。
跑着跑着,遇到了长江,必须换乘船只运送,难道让马飞过去、或游过去?
到了长江北,继续快马向西北奔去…
跑着跑着,遇到了淮河,又要换乘轮船了,不换行不行,肯定不行!
到了淮河北,继续快马向目的地“长安”奔去…
最终,香蕉到达目的地,成了杨贵妃的美餐…

如果把士兵比喻成IP包,
则马、船只就是数据链路层,
为何IP包每一跳需要更换数据链路层,就如同士兵需要不断变换交通工具一样自然,形势所迫啊!

问同学们一个问题:为何士兵要将香蕉向北运到广东?而不是向南运到澳洲?
同学们一定会哈哈笑,这还要问吗?因为广东更靠近杨贵妃!

下一个问题是:为何士兵不直接奔向长安?而是先到广东码头?
同学们一定会回答:码头是必经之地,码头是通向目的地长安一块跳板,
尽管不是最终的目的地,但士兵(IP包)却需要经过它。

如果有飞机,士兵一定直飞西安,而不会再绕到广东码头,在这里,飞机同样是数据链路层,
因为它的目的是服务士兵(IP包),而士兵携带着最终的目的地:西安!


一、网络传输地图全览:

从点开一个网址开始,到浏览器显示内容…
数据可整整经历了一个往返:
在这里插入图片描述
在这里插入图片描述


具体来说:

在这里插入图片描述
在这里插入图片描述


二、浏览器和服务器概览:

1.应用层视角:浏览器和服务器收发HTTP报文:

(1)要符合HTTP协议:

HTTP协议就是:
规定了请求和应答消息的格式:
请求消息包括请求行(方法、URI、HTTP版本)、消息头和消息体
响应消息包括状态行(HTTP版本、状态码、响应短语)、消息头和消息体
客户端向服务器发送 请求消息
服务器收到消息后对客户端 响应
在这里插入图片描述

(2)浏览器发送请求消息:

浏览器先要生成请求消息,并 委托操作系统(TCP/IP协议栈) 发送

请求消息主要说了两件事:“对什么”和“进行怎样的操作”
“对什么”:从网址URL中提取出URI,就是服务器的文件路径
“进行怎样的操作”指的就是Get和Post
当然,还要发送版本号、消息头和空消息体

(3)服务器准备响应内容:

服务器收到请求消息,会将请求URI转换为实际目录结构的实际文件名
这个文件要么是一个HTML文件,直接放到响应消息体中就行了
要么是一个CGI程序,我们运行这个程序,将结果放到响应消息体中

不过,在这些操作之前,浏览器也可以先根据需求检查一些请求包的参数
进行允许或禁止访问控制,常用的方法有三种:

①客户端IP地址
 
②客户端域名

先根据客户端的IP向DNS服务器反向查询客户端的域名
为保险起见,再通过域名查询发送方IP地址,以防止客户端在DNS上注册假域名
如果两者一致,就允许访问

③用户名和密码

(4)浏览器解析服务器回复的响应消息并显示内容:

首先,看一下Content-Type=text/html
根据MIME规格,可以确定这个响应,主类型是文本数据,子类型是HTML
之后,再看一下编码方式,charsrt=utf-8,以uft-8的字符编码显示网页

下面看一个具体的例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2.浏览器和服务器应用委托TCP\IP协议栈的视角:

在客户端请求服务器之前,服务器应先正常运行
服务器要 购买域名,以确保自己的域名能在DNS服务器上找到
服务器在编程开发测试架设部署运维之后正式上线,这时,先要启动服务器:

PS:服务器需要接受客户端的请求,所以 服务器 就需要 进行准备工作,等待 客户端的连接
服务器需要同时和多个客户端通信,所以每当一个客户端连接进来,服务器就要 启动 一个 新的
服务器程序,这样服务器程序和客户端程序就是 一对一 的状态了。

如下图,当服务器程序启动并读取配置文件完成初始化操作后,就会运行 等待连接模块(a)
这个模块会 创建套接字,然后进入 等待暂停状态
接下来,当有客户端发起连接时,这个模块会恢复运行并接受连接
然后启动 客户端通信模块(b),并 移交完成连接的套接字
接下来客户端通信模块(b)就和客户端进行通信,通信结束后,这个模块就退出了
在这里插入图片描述
上述这些过程,都是调用操作系统Socket库函数完成的,来看看调用的具体过程:
客户端通信模块需要经过下面4个阶段:

(1)创建套接字阶段

套接字 是 一块用于存放控制信息的内存空间
里面存着:通信对象的IP地址、端口号、通信操作的状态、发送数据经过了多长时间等
套接字创建完成后会返回一个描述符
描述符 是我们本机的应用程序识别套接字的编号,
协议栈内部找这段内存空间用描述符更快
而且在还没有建立连接的情况下,端口号和ip地址信息是不全的,只能使用描述符

(2)连接阶段(用管道连接服务器端的套接字)(三次握手)

三个参数:
描述符:找到我方套接字
服务器IP地址和端口号:找到对方地址(服务器)以及对方的套接字(服务器上的应用)
IP地址和端口号 是客户端和服务器之间用来识别对方套接字的机制

(3)数据收发阶段
 
(4)断开连接阶段(断开管道并删除套接字)(四次挥手)

服务器或客户端,一方先调用Socket库中的close()程序,另一方也就断开了

服务器端在第(2)步有些不同:

(1)创建套接字阶段
 
(2-1)将套接字设置为等待连接状态

bind()将端口号写入套接字,客户端要访问的端口号就是在这一步设置的
Web服务器使用80端口号
listen()向套接字写入等待连接状态

(2-2)接受客户端的连接

accept()函数执行,开始等待客户端connect()的包到达(等待连接模块(a))
一旦客户端的包到达,就会返回响应包并开始接受连接的操作
协议栈会给等待连接的套接字复制一个副本
然后将连接对象等控制信息写入新的套接字中
以后,这个新的套接字就和客户端的套接字连接在一起了
而原来处于等待连接的套接字,会再次调用accept()
ps:如果不创建副本,而是直接让客户端连接到等待的套接字上,
那就没有其他套接字等待连接了,所以复制副本是必要的
但是,这又出现了一个问题:
端口号是用来识别对方套接字的
以前我们说,不通套接字应该对应不通端口号
但在服务器端,套接字都是80端口号
所以,在服务器端,客户端不能仅靠端口号来识别服务器的套接字
而是使用:客户端IP,客户端端口号,服务器端口号,(服务器IP),这3(4)项来识别服务器的套接字

(3)数据收发阶段
 
(4)断开连接阶段(断开管道并删除套接字)

在这里插入图片描述


3.客户端和服务器的TCP\IP协议栈的具体操作视角:

这里以接收为例,发送过程相反
网卡:
接受到电信号\光信号,将其还原为0\1数字信息
在这里插入图片描述
还原成的数字信息如下:
在这里插入图片描述
MAC模块:
接下来根据包末尾的FCS来检验错误,如果错误就丢弃
如果没错,看看MAC地址是不是自己的,如果不是,就丢弃
如果是,存储到网卡内部缓存区
通过中断通知CPU

然后网卡驱动开始运行,从缓存区读出收到的包
根据MAC头部判断是不是交给IP协议

IP模块:
IP模块检查校验后,看看IP是不是给自己的
如果服务器启动了类似路由器的功能,则对不

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值