这一篇笔记对于计算机网络的描述非常模糊,具体可以参考==<<计算机网络自顶向下方法>>==

网络基础

协议

协议的概念

  • 协议就是一种规则,传输和发送数据时都需要遵循对应的协议(数据传输的规则)
  • 常见协议:
    • 传输层: TCP/UDP协议
    • 应用层: HTTP 协议, FTP协议 , ssh nfs telnet
    • 网络层: IP协议,ICMP协议,IGMP协议
    • 网络接口层: 常见的协议有ARP协议,RARP协议,以太网帧协议

分层模型

  • OSI七层模型: "物,数,网,传,会,表,应":
    • 应用层
    • 表示层
    • 会话层
    • 传输层
    • 网络层
    • 数据链路层
    • 物理层
  • TCP/IP 四层模型:
    • 应用层
    • 传输层
    • 网络层
    • 网络接口层
  • 对应关系如下: alt text

通信过程

  • 对于信息的封装过程是从上层到下层的,就是 应用层 -> 传输层 -> 网络层 -> 网络接口层
  • 注意数据如果没有封装的话,就不可以在网络中传递
  • 传输过程如下: alt text
  • 比如两台计算机通过TCP/IP协议通信的过程如下: alt text

网络链路层

以太网帧

  • 以太网帧的格式: alt text
  • 源地址就是值得本地网卡的硬件地址(也成为MAC地址),一般出场之后就会分配,全球唯一地址(可以使用ifconfig) 查看
  • 此时不知道目的主机的MAC地址

ARP协议

  • ARP协议: 根据IP地址获取到mac地址
  • ARP协议获取mac地址的方式和其数据格式: alt text
  • 注意以太网帧利用ARP协议获取到MAC地址
  • 比如一种可能的ARP数据格式如下:
  • 总结一下过程: 首先以太网通过 ARP 协议获取到目标主机的MAC地址,之后通过目的主机的MAC地址封装以太网数据帧进行数据传递,利用ARP协议的过程如下,首先把对方的MAC地址填写为 ff:ff:ff:ff:ff:ff 并且指定对方的IP地址,当传递到目标IP地址的机器的时候,对方就会发送一个ARP应答信号,利用这一个应答信号就可以获取到对方机器的MAC地址
  • APR协议解释如下: alt text
  • 举例如下: alt text

网络层

IP协议

  • IP段协议格式如下: alt text
  • 版本: IPV4 IPV6
  • TTL: time to live 表示数据包的最大的跳转上限次数,每经过一个路由节点,该值-1,每一次经过一个路由节点,该值-1,减少为0的时候,就会将这一个数据包丢弃
  • IP: 324个字节 192.168.59.132 表示点分十进制,但是需要转换成二进制才可以查看
  • 目的IP: 324个字节

传输层

TCP协议

  • TCP数据报格式: alt text
  • IP地址和端口号:
    • IP地址: 可以在网络环境中,唯一表示一台主机
    • 端口号: 可以网络的一台主机上,唯一表示一个进程
    • IP地址+端口号: 可以在网络环境中,唯一表示一个进程
  • UDP:
    • 16位源端口号
    • 16位目的端口号
  • IP协议:
    • 16位源端口号
    • 16位目的端口号
    • 32位序号
    • 32位确认序号
    • 6个标志位
    • 16位窗口大小

CS模型/BS模型

  • CS 模型: Client-Server 模型
  • BS 模型: Browser-Server 模型
特点C/SB/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: 表示关闭读写
  • 注意 shutdownclose 关闭的区别: 对于多个文件描述符引用的文件,利用shutdown会导致所有文件描述符都关闭,但是close只会关闭其中的一个文件描述符