这一篇笔记对于计算机网络的描述非常模糊,具体可以参考==<<计算机网络自顶向下方法>>==
网络基础
协议
协议的概念
- 协议就是一种规则,传输和发送数据时都需要遵循对应的协议(数据传输的规则)
- 常见协议:
- 传输层:
TCP/UDP
协议 - 应用层:
HTTP
协议,FTP
协议 ,ssh
nfs
telnet
- 网络层:
IP
协议,ICMP
协议,IGMP
协议 - 网络接口层: 常见的协议有
ARP
协议,RARP
协议,以太网帧协议
- 传输层:
分层模型
OSI
七层模型: "物,数,网,传,会,表,应":- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
TCP/IP
四层模型:- 应用层
- 传输层
- 网络层
- 网络接口层
- 对应关系如下:
通信过程
- 对于信息的封装过程是从上层到下层的,就是 应用层 -> 传输层 -> 网络层 -> 网络接口层
- 注意数据如果没有封装的话,就不可以在网络中传递
- 传输过程如下:
- 比如两台计算机通过
TCP/IP
协议通信的过程如下:
网络链路层
以太网帧
- 以太网帧的格式:
- 源地址就是值得本地网卡的硬件地址(也成为
MAC
地址),一般出场之后就会分配,全球唯一地址(可以使用ifconfig
) 查看 - 此时不知道目的主机的
MAC
地址
ARP协议
ARP
协议: 根据IP
地址获取到mac
地址ARP
协议获取mac
地址的方式和其数据格式:- 注意以太网帧利用
ARP
协议获取到MAC
地址 - 比如一种可能的
ARP
数据格式如下: - 总结一下过程: 首先以太网通过
ARP
协议获取到目标主机的MAC
地址,之后通过目的主机的MAC
地址封装以太网数据帧进行数据传递,利用ARP
协议的过程如下,首先把对方的MAC
地址填写为ff:ff:ff:ff:ff:ff
并且指定对方的IP
地址,当传递到目标IP
地址的机器的时候,对方就会发送一个ARP
应答信号,利用这一个应答信号就可以获取到对方机器的MAC
地址 APR
协议解释如下:- 举例如下:
网络层
IP协议
IP
段协议格式如下:- 版本:
IPV4
IPV6
TTL
:time to live
表示数据包的最大的跳转上限次数,每经过一个路由节点,该值-1
,每一次经过一个路由节点,该值-1
,减少为0
的时候,就会将这一个数据包丢弃- 源
IP
:32
位4
个字节192.168.59.132
表示点分十进制,但是需要转换成二进制才可以查看 - 目的
IP
:32
位4
个字节
传输层
TCP协议
TCP
数据报格式:IP
地址和端口号:IP
地址: 可以在网络环境中,唯一表示一台主机- 端口号: 可以网络的一台主机上,唯一表示一个进程
IP
地址+端口号: 可以在网络环境中,唯一表示一个进程
UDP
:16
位源端口号16
位目的端口号
IP
协议:16
位源端口号16
位目的端口号32
位序号32
位确认序号6
个标志位16
位窗口大小
CS模型/BS模型
CS
模型:Client-Server
模型BS
模型:Browser-Server
模型
特点 | C/S | B/S |
---|---|---|
优点 | 缓存大量数据,协议选择灵活,速度快,程序的更新比较便捷,只用更新客户端 | 安全性比较高,跨平台,开发工作量比较小 |
缺点 | 安全性,跨平台麻烦 | 不可以缓存大量数据,严格遵循http 协议 |
TCP通信模型
TCP 通信时序
- 也就是
TCP
的三次握手,四次挥手
三次握手
- 三次握手的过程(内核自己完成):
- 注意上述中的数字表示发送的总共字节数量(编号)(括号里面的就是这一次发送的数据的字节数量)
- 但是不一定每一次就发送一次数据,而是可以一次发送多条数据,服务器端可以使用一次确认的方式来向客户端发送
ACK
信号
四次挥手
- 四次挥手过程:
- 注意发送
ACK
并不是发送数据,没有携带数据 - 四次握手的关键就是半关闭
- 为什么最后一次还是可以发送
ACK
,这是由于半关闭只是关闭了写缓冲,但是没有关闭建立的连接,连接还是存在,只要不用缓冲区就可以发送数据了
滑动窗口
win
标志位就是表示滑动窗口的大小- 滑动窗口工作原理:
- 滑动窗口的作用: 防止数据丢失(防止数据丢失)
- 客户端和服务器端的缓冲区都维护者一个滑动窗口,每一次服务器端发送数据的时候或者客户端发送数据的时候,都会利用
WIN
标志位发送滑动窗口的大小,对方通过滑动窗口的大小判断发送数据的时机,如果滑动窗口的空间不足就会暂时停止发送数据
总结
- 三次握手:
- 主动方发起连接请求端,发送
SYN
标志位,请求建立连接,携带数据包包号,数据字节数(0),滑动窗口大小 - 被请求连接请求端,发送
ACK
标志位,同时携带SYN
标志位,携带数据包包号,数据字节数(0),滑动窗口大小 - 主动发起连接请求端,发送
ACK
标志位,应答服务器连接请求,携带数据包包号
- 主动方发起连接请求端,发送
- 四次挥手:
- 主动请求结束连接端,发送
FIN
标志位,请求关闭连接,携带数据包号,数据字节数(0) - 被动关闭连接请求端,应答
ACK
标志位 (半关闭完成) - 被动干部安必请求端发送
FIN
标志位 - 主动关闭连接请求端发送
ACK
标志位 (关闭完成)
- 主动请求结束连接端,发送
- 滑动窗口: 标志着本端口的缓冲区大小,防止数据发生覆盖
TCP 状态转移
TCP
状态转义图如下:- 可以使用
netstat
来查看 端口号和TCP
连接建立状态
主动发起连接状态
- 注意如下的主动方或者被动方并不一定就是指的客户端还是服务器端,而是主动发送信号和被动接受信息的一方
- 主动发起连接状态时的状态转移如下:
- 也就是状态转移图中的:
CLOSE
+SYN
--->SYN_SEND
SYN_SEND
+SYN ACK
--->ESTABLELISHED
主动关闭连接状态
- 主动关闭连接状态转移图:
- 转移状态就是图中的:
ESTABLISHED
+FIN
-->FIN WAIT1
FIN WAIT1
+ACK
-->FIN WAIT2
(半关闭)FIN WAIT2
+FIN ACK
-->TIME WAIT
TIME WAIT
+Timeout
-->CLOSED
- 可以使用
netstat -anp
命令查看连接建立状态 - 注意为什么之前频繁出现端口占用问题,这是由于如果时服务器端首先关闭,那么就会导致此时服务器端口处于
TIME WAIT
状态,而不是CLOSE
状态,所以再次启动服务器就会发生端口占用的情况
被动接受连接状态
- 被动端接受连接状态示意图:
- 状态转移途径:
CLOSED
-->LISTEN
LISTEN
+SYN ACK
-->SYN_RCVD
SYN_RCVD
+ACK
-->ESTABLISHED
被动关闭连接状态
- 被动段关闭连接状态示意图:
- 状态转移途径:
ESTABLISHED
(数据通信状态) --> 接受FIN
-->ESTABLISHED
(数据通信状态) --> 发送ACK
-->CLOSE WAIT
(说明对端(主动关闭连接端)处于半关闭状态) --> 发送FIN
-->LAST ACK
--> 接受ACK
-->CLOSE
2MSL时长存在的意义
- 作用: 保证最后一个
ACK
可以被对端接受(等待期间,对端没有受到我发送的ACK
,对端就会再一次发送FIN
请求) - 注意
2MSL
时长发生于主动关闭连接请求一段,同时TIME_WAIT
也是只有主动关闭连接的一端才有的状态 - 总结:
- 主要就是可以根据退出状态结合
netstat -anp
命令来判断错误出现的位置,之后可以使用tldr
命令查看命令的用途比较直观
- 主要就是可以根据退出状态结合
其他状态
- 也就是其他的异常情况下的状态
半关闭
- 需要重点记忆的几个状态如下:
ESTABLISHED
,FIN_WAIT2
CLOSE_WAIT
TIME_WAIT
(2MSL
)
- 半关闭:
FIN_WAIT2
,可以使用close
函数完成半关闭,也可以使用shutdown
函数 shutdown
函数的函数原型如下,可以用于关闭读端或者写端,可以指定关闭套接字中的读端或者写端
int shutdown(int sockfd, int how);
how
:SHUT_RD
: 表示关闭读端SHUT_WR
: 表示关闭写端SHUT_RDWR
: 表示关闭读写
- 注意
shutdown
和close
关闭的区别: 对于多个文件描述符引用的文件,利用shutdown
会导致所有文件描述符都关闭,但是close
只会关闭其中的一个文件描述符