一. 复习 - 网络原理
1. 层次划分(TCP / IP)
应用层 -> 传输层 -> 网络层 -> 数据链路层
2. 局域网内,数据链路如何通信:
数据的广播的特性(MAC 地址) / 冲突域
3. 局域网内,应用层 和 应用层之间如何通信
- 从上往下:不断封装
- 从下网上:不断解包、不断分用
4. 跨局域网的情况下,应用层 和 应用层如何通信:
5. 路由设备:
划分局域网,网关的作用
二. 复习 http 协议
应用层的最主要的一个协议
1. URL 的概念:
资源的唯一标识地址
2. 请求:
客户端发送的就是请求
3. 响应:
服务端发送的就是响应
4. C/S:
Client 是请求资源方,Server 是提供资源方。(相对的)
5. 请求格式:
这个图有个错误,空行是属于请求头的内容,详情参照响应格式的响应头
常见的方法:
默认方法为 GET
常见的方法是 GET 和 POST:区别:GET 没有请求体,POST 有请求体
6. 相应格式:
常见的状态码:三位数
| 1xx | 不常见 | 不常见 |
|---|---|---|
| 2xx | 请求成功 | 200 |
| 3xx | 资源需要跳转 | 301/ 302/307 |
| 4xx | 客户端错误 | 403 / 404 / 405 |
| 5xx | 服务器错误 | 500/502/504 |
三. 复习socket编程
代码见我的GitHub
关于udp和tcp的 cs 套接字
四. TCP/IP 协议(传输层 + 网络层 + 数据链路层)
1. 传输层:端到端
端口 + IP
在网络上(不考虑私网):
- IP 的作用是唯一标识一台主机,主机拥有唯一的一个 IP 地址,主机可以拥有多个 IP 地址(主机里边有多个网卡)
- Port 的作用是标识主机上的唯一一个进程,一个进程可以拥有多个port,而一个port 只能属于一个进程
- 一组 IP + port 可以标识网络上的一台唯一的主机 和 该主机上的唯一一个进程
- 五元组(先不管协议):远端 + 本地
源 IP + 源端口号 + 目的 IP + 目的端口号 + 协议号
可以标识网络网络上唯一一个端对端的通信通道 - 五元组工具演示
- 常见的端口划分策略
- 建议 1024 以下的端口留给知名的一些服务用(well know),只是建议,例如:MySQL 的端口是 3306.导致监听 1024 以下的端口时,一般需要管理员。
- 常见的端口:
其他:MySQL 服务器,使用 3306 端口;
DNS 服务器,使用 53 端口。
两个问题
- 一个进程是否可以绑定多个端口号?
- 可以
- 一个端口号是否可以被多个进程绑定?
- 不行,但是有特例
2.UDP 协议
-
特性:
- 不可靠的:没有确认机制、没有重传机制;如果因为网络故障该段无法发送到对方,UDP 协议层也不会给应用层返回任何错误信息
- 面向报文:不能灵活的控制读写数据的次数和数量
- 无连接:知道目标的 IP 地址和 端口号就直接传输,不需要建立连接
-
UDP 首部
解包用的是 UDP 长度,分用用的是 源端口号
源端口号,还是
校验和
验证数据的正确性(数据在传输过程中没有发生错误变化)
若是数据发生错误怎么办?直接丢弃
- 其他知识
- UDP 没有发送缓冲区(指的是 UDP 传输层上),即UDP 不保存数据,收到数据,进行加工(套上UDP首部),就直接发送
- UDP 的发送成功代表数据已经到达了 网络层,但不代表对方收到
- UDP 有接收缓冲区
- 应用层 receive 是堵塞的
- UDP 的socket 能读能写,所以是全双工的
- 基于UDP 的应用层协议
- NFS: 网络文件系统
- TFTP: 简单文件传输协议
- DHCP: 动态主机配置协议
- BOOTP: 启动协议(用于无盘设备启动)
- DNS: 域名解析协议
- DNS(Domain Name Service)域名解析服务
即 把 www.baidu.com 变成 172.16.34.44
- DHCP:动态申请IP
DHCP / Local DNS / Gateway(网关) ------- 都是家里的路由器
3. TCP 协议:
-
3.1 TCP首部
- 目的端口用来分用,首部长度用来解包
不太重要的字段:
URG:urgent 紧急1 + 配合 16 位的紧急指针 使用
PSH:push,在发送数据时,因为有缓冲区,可以用 psh,建议别缓冲这份数据
校验和:检查数据正确性
3.2TCP 的特点:
- 可靠性:为了保证可靠性而实现一些机制
- 有连接
- 面向流
3.3 确认应答机制:
- 可靠性的第一种表述:作为一个发送方,希望知道我的数据接受方是否收到。
32位的 序号(Sequence Number,SN) 就是编号
32位的确认序号(Acknowledge Sequence Number,ASN)就是确认编号
发送的每个数据都带着 SN
如果数据中的 ACK 被置为1,标识该 TCP 包蛋确认含义(发送数据和确认含义公用的)
ASN 可以计算出收到哪些序号
- 其中,一个 TCP 的通信过程中,只有第一个 Segment 的 ACK 没有置为 1,其他全部含有 ACK 含义.
- ASN 的细节含义:希望发送端发送的下一个字节序号
- 可靠性的第二种表述:保证数据是按序收到的
汽车按照1,2,3的序号按照不能的路线发送,在到达最终结果时的顺序为:2,1,3.
TCP 利用 SN 和 ASN 可以保证 数据是按序收到的,如上例,2在1号车前边到达时,TCP可以利用SN序号,让接收方在接收了 1号车之后,在接收2号车.
SN的第二个作用
3.4 超时重传机制
向接收方发送数据,但在一定时间后,并没有收到来自接收方的确认信息
- 可能是对方没有收到我的数据,接收方之前没有收到,所以可以接收此次的重复传递
- 对方收到数据,但对方发来的应答,我没有收到,接收方重复接收,但因为有序号,所以可以直接丢弃,也没有问题
超时重传的含义:
- 超时:指的就是超过了这个估计时间
- 重传:把没有收到应答的数据重新发送一次
一定时间:估计我的话传到对方的时间 + 对方应答传回来的时间
SN的第三个作用:去掉重复包
3.5可靠性的含义:
第 0 层含义:数据不会出现错误。 By 校验和
第 1 层含义:确保发送的数据,对方有收到 By 确认应答(SN/ASN/ACK)
第 2 层含义:确保发送的数据,对方是按序收到 By SN