计算机网络基础知识讲解
TCP/IP
TCP/IP是指能够在多个不同网络间实现信息传输的协议簇
TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议
为什么会有这些协议的东西呢?其实就是约定的一个规矩,一个在网络通信时定义的规矩,好让大家都遵守并且准确完成通信。
ok,下面具体说下有哪几层:
- 应用层:HTTP,FTP,DNS
- 传输层:TCP,UDP
- 网络层:IP
- 数据链路层:以太网,Wi-Fi
应用层
应用层其实就是直接跟应用交互的,比如我们平时用浏览器访问地址,手机中请求接口,都是属于HTTP应用层的场景。
这一层是不管数据传输的具体情况的,只管发送和接受数据,作用在于产生数据报文。
一般就是使用最多的就是HTTP,那FTP,DNS又是什么呢?
FTP(File Transfer Protocol):文件传输协议,端口号:21;用户可通过客户机程序向远程主机上传文件;或从远程主机上下载文件。
DNS(Domain Name System):域名解析协议,端口号:53;通过域名解析获得域名所对应的IP
传输层
这一层用来负责数据传输的具体过程,保证每个数据能够准确的发送传输过去。
这一层作用在于告诉数据报文如何去目的地,比如要拆分报文之类的。
其中,TCP和UDP有什么区别呢?
- TCP 是面向连接的,UDP 是面向无连接的
- UDP程序结构较简单
- TCP 是面向字节流的,UDP 是基于数据报的
- TCP 保证数据正确性,UDP 可能丢包
- TCP 保证数据顺序,UDP 不保证
可以看到TCP适用于稳定的应用场景,他会保证数据的正确性和顺序,所以一般的浏览网页,接口访问都使用的是TCP传输。
而UDP是一种结构简单的协议,不会考虑丢包啊,建立连接等。所以适用于直播,游戏等场景。
说到TCP,就要说到TCP的三次握手和四次挥手了
TCP建立连接需要三次握手:
- 客户端A向服务端B表示自己想跟B连接(客户端发送syn包(syn=x)到服务器,A进入SYN_SENT状态)
- 服务端B收到信息,表示我也想跟你连接(服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,B进入SYN_RECV状态)
- 客户端A收到消息,告诉B我收到了你想跟我连接,我们开始连接吧(客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),AB进入ESTABLISHED状态)
TCP断开连接需要四次挥手:
- 客户端A向服务端B表示自己想跟B断开连接了(Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态)
- 服务端B收到消息后,告诉A我收到消息啦,但是等等我这边还有数据没传完哦(Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。)
- 服务端B告诉A,我这边数据发完了,我要断开和你的连接了哦。(Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。)
- 客户端A收到消息,并告诉B我收到消息了,你断开吧。(Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手)
为什么连接是三次握手,断开需要四次呢?
关闭的时候,服务器端B收到客户端A关闭请求后,不能马上关闭,因为客户端没数据传输了,但是服务器端有可能还有数据还在传输给A,所以在收到A关闭请求后,等数据传完后再告诉A,可以关闭了。
网络层
IP网络层主要负责网络连接的建立和终止以及IP地址的寻找
这一层的作用在于告诉数据报文去哪,要找到数据报文的目的地
数据链路层
数据链路层是负责网络在现实世界的一个表现,比如以太网,Wi-Fi
这一层的作用就是告诉数据报文如何走了,是数据报文实际走的路线
形象总结
ok,现在大家都基本清楚了每一层的含义了把,这里我总结了一个比较形象的例子,让大家更深刻的理解到网络分层以及数据传输的过程。
故事开始于一个公子想向一位小姐写情书。。。
HTTP
Hypertext Transfer Protocol,超⽂文本传输协议
位于TCP/IP协议族的应用层,用于网络上请求和传输数据
URL格式
http://www.baidu.com:80/s?ie=utf-8
- http 属于协议类型
- www.baidu.com 属于服务器地址
- 80 属于端口号
- /s 属于路径
- ie=utf-8 属于携带参数
HTTP报文
HTTP报文分为请求报文和响应报文
请求报文
//请求行
GET /s HTTP/1.1
//Headers
Host: www.baidu.com
Content-Type: text/plain
//Body
搜索****
请求报文分为三部分:
- 请求行 (包括method、path、HTTP版本)
- Headers
- Body
其中请求报文中的请求方法 常见有四种
- GET 获取资源,没有body,幂等性
- POST 增加或者修改资源,有body
- PUT 修改资源,有body,幂等性
- DELETE 删除资源,幂等性
什么是分块传输,什么是断点续传?
1、分块传输指的是服务器发给客户端的数据可以分成多个部分传输。
使用方法:
- 消息头部设置 Transfer-Encoding: chunked
- 每一块会表明长度
- 由一个标明长度为0的chunk标示结束
目的:
让客户端快速响应,减少等待时间
2、断点续传指的是客户端想从文件上次中断的地方开始下载或者上传
使用方法:
- 请求报文头部信息中加上Range字段,表示要从哪个字节开始下载(Range: bytes=0-499)
- 响应报文头部信息中加上Content-Range,表示当前发送的数据的范围,以及文件总大小(Content-Range: bytes 0-499/22400)
- ETag字段表示文件的唯一性
响应报文
//状态行
HTTP/1.1 200 OK
//Headers
Content-Type: application/json; charset=utf-8
//Body
[{"info":"xixi"}]
响应报文分为三部分:
- 状态行 (包括HTTP版本、状态码,状态信息)
- Headers
- Body
响应报文中的状态码 大概分为五种类型
- 1开头, 代表临时性消息,比如100(继续发送)
- 2开头, 代表请求成功,比如200(OK)
- 3开头, 代表重定向,比如304(内容无改变)
- 4开头, 代表客户端的一些错误,比如403(禁止访问)
- 5开头,代表服务器的一些错误,比如500
HTTPS
HTTP over SSL ,工作在 SSL (或 TLS)上的 HTTP
其实说白了,HTTPS就是在原本的http传输协议下层加了一个安全层(SSL),客户端和服务器端采用对称加密的方法进行加密传输。
只是传输过程中使用的对称加密哦,在整个验证证书到传输的过程中其实是用到了对称加密,非对称加密,和哈希算法。使用对称加密传输的原因是非对称加密的复杂性可能会影响到网络通信性能。
通信流程如下:
- 首先客户端请求建立TLS连接,发送tcp消息
- 服务器收到消息,发送证书给客户端
- 客户端收到证书,并验证
- 验证成功,和服务器协商出对称加密
- 开始用对称加密方式通信
其中第三步,服务器的证书,一般是由三层信息组成
- 服务器的公钥,名字和地区,证书签名
- 证书签名的签发机构的公钥,名字和地区,签发机构的证书签名
- 根证书机构的公钥,名字和地区
三环环环相扣,客户端的系统验证根证书,根证书验证签发机构,签发机构验证服务器公钥。