协议
三次握手
三次握手和四次挥手都位于传输层
1 建立连接
-
调用socket,创建fd
-
调用connect,向服务器发起连接请求
-
connect会发出SYN段,并阻塞等待服务器应答(第一次)
-
服务器收到客户端的SYN,会应答一个确认收到即SYN+ACK段来表示 “同意建立连接”(第二次)
-
客户端收到服务器的SYN+ACK后,会从connect()返回,同时向服务器应答一个ACK,确认收到(第三次)
TCP客户端和服务器建立连接的过程,称为三次握手
2 数据传输过程:
1.,TCP协议提供全双工的通信服务;全双工(同一时刻,同一连接中通信双方可同时写数据)
-
建立连接后,服务器从accept()返回,返回后立刻调用read(),读socket就像管道一样,如果数据未到达就阻塞等待,到达就从read()返回
-
服务器阻塞等待时客户端调用write()发送请求给服务器,服务器收到后从read()返回,对客户端的请求进行处理。服务器在处理客户端请求期间,客户端也调用read阻塞等待服务器的应答.
服务器调用write()将处理的结果发送给客户端后,继续调用read()阻塞式等待客户端的下一条请求。
- 客户端从read()返回,继续发送下一条数据,这样循环下去,否则准备断开连接(四次挥手)。
四次挥手
3 断开连接
-
如果客户端没有更多的请求,就调用close()关闭连接,此时客户端会向服务器发送FIN(第一次)
-
此是服务器收到FIN后,会回应一个ACK,同时read()返回0 (第二次)
-
read()返回之后,服务器就知道客户端关闭了连接,也调用close()关闭连接,这个时候服务器会向客户端发送一个FIN(第三次)
-
客户端收到FIN,最后再返回一个ACK给服务器(第四次)
断开连接的过程称为四次挥手
要清楚:read()是读请求的,write()是用来读响应的。
connect函数和TCP交互是通过发出SYN段
read()返回,说明收到了FIN 段
connect成功之后,
服务器
accept返回,并分配新的文件描述符和客户端通信。
read(fd_,buf,size)阻塞等待客户端数据请求
write(fd,buf,size)发送数据应答。
应用层
应用层的作用: 据说程序员写的网络程序基本都在应用层来进行编写,可见应用层重要性
再谈协议: 协议是一种约定,通信双方事先制定好的
HTTP协议
虽然我们说应用层的协议都是我们程序员自己定制的,实际上,大佬已经给我制定好了,我们拿来直接用就好了。
http协议-------超文本传输协议 。就是其中之一。
认识URL
平时我们所说的网址其实就是URL;
https://editor.csdn.net/md?articleId=104169840
协议名:https
articleId : 查询字符串
104169840:片段标识符
csdn.net:服务器地址
/md?:带层次的文件路径
’ + ‘ 被转译成了%2B
urldecode : 反转译
urlencode : 转译
来看一个fiddler抓包情况
看右侧的Raw
** 1 http请求(上面的):**
-
首行:方法 + url + 版本
-
Header: 请求的属性,冒号分隔的键值对;每组属性之间使用\n来分隔 ,即换行分割
遇到空行说明Header部分结束
3.Body空行后面的内容都是Body,Body允许为空字符串,如果Body存在,则在Header中会有一个Content-length属性来标识Body的长度;
2 http 响应(下边的)
-
首行:版本号 + 状态码 + 状态解释
-
Header:请求的属性,冒号分隔的键值对,每组属性之间\n 分隔,行分割,遇到空行表示Header结束
-
Body :空行后边的全是Body,Body存在,则在Header后有一个Content-Length属性标识Body的长度,如果服务器返回一个html页面,那么页面内容就在Body中;
HTTP的方法
方法 说明 支持的HTTP协议版本
GET 获取资源 1.0、1.1
POST 传输实体主体 1.0、1.1
PUT 传输文件 1.0、1.1
HEAD 获得报文首部 1.0、1.1
DELETE 删除文件 1.0、1.1
OPTIONS 询问支持的方法 1.1
TRACE 追踪路径 1.1
CONNECT 要求用隧道协议连接代理 1.1
LINK 建立和资源之间的联系 1.0
UNLINK 断开连接关系 1.0
其中最常见的就是 GET 和POST
HTTP状态码
状态码 类别 原因
1XX 信息性 请求正在处理
2XX 成功 正常处理完毕
3XX 重定向 需进行附加操作来完成
4XX 客户端错误码 服务器无法处理
5XX 服务器错误码 服务器处理请求失败
最常见的状态码:
200(OK)
404(Not Found)客户端请求有问题
403(Forbidden) 禁止访问
302 (Redirect)重定向
504 (Bad GateWay) 网关超时
HTTP最常见的 Header
Content-Type 数据类型(text/html等)
Content-Length Body长度
Host:客户端高速服务器,请求的资源在那个端口上;
User-Agent:声明用户的操作系统和浏览器的版本信息
Referer:声明当前页面从哪个页面过来的
location:搭配3XX状态码使用,告诉客户端接下来去哪里访问
Cookie:用于在客户端存储少量的信息,通常用于实现会话功能。它保存在客户端浏览器,是一个字符串,字符串协议程序员可以自己约定
IP协议
1 地址管理
ipv4 32位
地址不够怎么办;
1 动态分配 主机联网才分配,断网就回收
2 :NAT 机制 局域网内共用一个IP
3 ipv6
2 路由选择
IP地址为 点分十进制 192.169.1.106
1 同一个网段内的主机网络好一定相同,主机号一定不同。(出现特例一定不能正常上网)
2 相邻网段(连接在一个路由器上的)的主机,网络号一定不相同。
主机地址全0 就成为 了 网络号,代表此局域网
主机地址全1 就成了广播地址。(UDP能广播,TCP不能广播)
私网IP 和 贡丸IP
私网IP 局域网内部使用
1: 10.*前8位是网络号
2:172.16.* --- 172.31.* 前12位是网络号
3:192.168.*
其余 均为公网ip
路由选择(类似于导航)
路由选择的过程就是进行路由间相互问路的过程。
为了防止一台路由器挂掉导致整个体系瘫痪,我们常做多份备份路由,叫做冗余。
route指令查看路由表
数据包 来到路由器后 ,跟子网掩码Genmask 相与,相与结果再在Destination中找目的IP,找到了一样的就发送,没有就找下一跳(default) ,
数据链路层:
以太网, 以太网 不是一种具体的网络,而是一种技术标准。称为协议
以太网为什么存在MTU?
因为硬件的缘故,必须要求数据帧在1500字节范围内
MTU在数据链路层中 ,最大的数据帧为1500字节,不同协议中,MTU最大值也不同
加入要发送的数据帧大于MTU,就会将数据帧分解,前几部分都是1500字节,后边余多少就是多少了。
**
DNS域名解析协议
**
**DNS是一套从域名映射到IP的系统**
IP地址 + 端口号 来进行唯一确定一台主机上的一个进程
因为IP地址不好记,人们就发明了主机名(string),
并用hosts文件来管理维护主机名和IP的地址关系。
假如DNS服务器挂掉了,全世界的人民都上不了网了吗?
大佬都想好方案:采用分布式的DNS服务器,在全球建立多个DNS系统(类似于路由冗余)
DNS 地址;
8.8.8.8 谷歌维护的全球的根域名解析服务器 ---
114.114.114.114
在局域网中 ,路由器自己也维护了一个映射关系
内网IP和端口映射一个路由器IP和端口号 所以外网感知不到局域网内网(内部主机)
因为端口号的数量是有限的,所以 NAT只能维护端口号范围内的主机数量的网络
在浏览器中输入一个url都发生了什么?我们可以从以下几个角度进行分析:
1 从操作系统管理硬盘设备角度:
2 从网络通信的角度看:
1 进行DNS域名解析
2 HTTP角度
3 从自定制协议的角度(URL中关键字的query string怎么设计,body都包含了什么内容等等,cookie)
3 从传输层的角度
1 TCP连接建立的角度
2 长短连接的角度(一个TCP连接涵盖好几个HTTP的交互过程 称为长连接) 好处:开销小效率高
4 从网络层和数据链路层的角度
1 从IP地址的相关规则
2 路由选择的角度
3 数据链路层的相关规则
5 通信原理的角度(谨慎哦,不清楚别提)
浏览器 (外部也可连接一个CDN )
搜索入口服务器
(1 分词服务器
2 检索服务器
3 物料服务器(查询最终数据)
4 用户服务器(用户的一些信息)
5 广告服务器(类似于搜索入口服务器))
分布式服务器使用大量的反向代理服务器 :就像各种运营商提供的服务器一样
负载均衡:
1 提高效率
2 提高可靠性
3 可伸缩性(通过增加或减少服务器的数量来让负载均衡)