计算机网络基础知识整理

525 阅读9分钟

总结一下计网相关的基础知识,平时做项目遇到问题或者面试的时候也会用的到。

一、网络模型

OSI 七层模型: 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层

TCP/IP 体系结构: 应用层 传输层 网络层 链路层

TCP/IP体系结构

二、IP/TCP/UDP 协议介绍

  • HTTP 的报文段,GET/POST 请求的区别(应用层协议) HTTP 基于 TCP 协议,是一种请求-响应连接,即只能由客户端发起。
    • HTTP1.0 时,连接时无状态、无连接,一次连接只处理一个请求,之后就断开。HTTP1.1 中,引入了 cookie 技术,帮助 HTTP 请求保存状态,也引入了长连接,可以等待之后的多个请求发出,可以由服务端设置。
    • GET - 从指定的资源请求数据。get 的请求参数在 URL 中
    • POST - 向指定的资源提交要被处理的数据,请求参数在请求体中
    • 请求报文的格式和响应报文的格式:
      HTTP请求报文格式
HTTP响应报文格式
  • TCP 介绍及报文结构(传输层协议)

    • 传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付的传输协议,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。
      TCP报文结构
  • UDP 介绍及报文结构(传输层协议)

    • 用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付的传输层协议,没有拥塞控制,面向报文(对于应用层传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。
      UDP报文结构
  • IP 的报文段结构(网络层协议)

    IP报文段结构

三、重点知识

  • TCP 三次握手的过程和原因(不要只说表面原因)
    TCP三次握手的过程

下面是三次握手的过程具体分析(假设由客户端发起请求)

第一次握手:客户端初始化一个序列号 seq=x,将 SYN 同步位置位 1,表示建立连接。
第二次握手:服务端初始化一个序列号 seq=y,将 SYN、ACK 同步为置位 1,将 ack 赋值为 x+1,ack 表示服务端期望收到的下一段数据的开始序列号。
第三次握手:客户端将 ACK 同步位置位 1,seq 为该段数据的起始序列号,ack=y+1,表示客户端期望收到的下一段数据的开始序列号。

为什么要有三次握手:

表面原因:网络中有一个滞留的请求到达了服务端,服务端向客户端发起请求,如果只有两次握手的话连接已经建立,但是没有数据进行传输,浪费资源。

必要原因:第二次握手客户端获取了服务端发过来的ack(确认序列号),客户端知道服务端期望收到的下一个数据的开始序列号。第三次握手服务端会获取客户端的ack,服务端才会知道客户端期望收到的下一个数据的开始序列号。这样第三次握手保证服务端向客户端发送的数据是有序可靠的。否则只有客户端向服务端发送的数据是有序可靠的。 总结来说:如果只有两次握手,客户端知道服务端想要什么,但是服务端不知道客户端想要什么。

  • TCP 四次挥手的过程和原因
TCP四次挥手的过程

四次挥手的过程:

由于TCP的连接是全双工的,即客户端可以从服务端读也可以向服务端写,服务端同理。那么挥手要完成的就是断开这两根双向的连接。

数据传输的三种方式

1、首先客户端主动发起关闭请求(发送FIN代表想要关闭从请求者到接收者方向的连接),服务端收到后发送确认数据包,那么客户端就会关闭向服务端的写进程。服务端进入CLOSE-WAIT状态,发送完待传输的数据后,然后关闭向客户端的写进程(被动关闭)

2、服务端发送关闭请求(这次是服务端主动了),客户端收到后发送确认数据包,这时候服务端如果收到了就会关闭向客户端的读进程,此时服务端通向客户端的连接完全断掉,进入CLOSED状态。如果服务端接收确认数据包超时了,那么会重新发出关闭请求。

3、客户端在发送确认数据包后会有一个TIME-WAIT状态,在2MSL内如果再次收到了服务端的关闭请求则代表上次的确认数据包服务端未收到,需要重新发送,当结束wait状态后,客户端关闭向服务端的读进程,进入CLOSED状态。

4、这里再解释一下客户端TIME-WAIT状态的意义,一个是为了防止客户端提前进入CLOSED状态无法接收服务端重发的关闭请求,另一个目的是等本次连接中的所有请求在网络中全部失效,保证下一次TCP建立连接过程中发送的都是有效连接,所以这个TIME-WAIT状态是必要的,也间接解释了TCP三次握手的表面原因(也是网上大部分给出的原因)是不成立的。

  • TCP 的流量控制和拥塞控制

    • 流量控制:TCP 首部中, 有一个 16 位窗口字段, 就是存放了窗口大小信息。接收端将自己接收的缓冲区大小放入 TCP 首部的”窗口大小“字段,传给发送端。窗口的大小越大,证明网络吞吐量越好。接收端一旦发现自己的缓冲区快满了,就会把窗口值设为一个很小的数通知发送端减慢数据的发送速度。如果接收端缓冲区满了,就会把窗口值设为 0,发送方不再发送数据。但是发送端会定期发送一个小的的探测窗口值的报文段,接收方把此时的窗口大小告诉发送端。

    • 拥塞控制:开始的时候会把拥塞窗口设为一个很小的值,每传输一次数据拥塞窗口大小呈指数增长,不能超过阈值(阈值在每次数据传输后也会加一),当超过阈值的时候进入线性增长(目的是在避免拥塞的前提下可以满额利用网络资源)。

      (1)当发送端连续收到三个相同的 ACK 时,证明有轻度的拥塞,阈值会变成当前窗口值的一半, 进入拥塞避免阶段。

      (2)当发生超时的时候,认为网络严重拥塞,阈值设为当前窗口大小的一半,窗口大小设为 1。

  • 网页访问的过程

    • 通过 DHCP 配置主机地址,通过一个 UDP 的报文进行广播,DHCP 服务器收到广播帧之后将主机需要的信息存入新的 UDP 报文中,将它发送给主机,主机进行解析得到自己的 IP 地址、子网掩码等信息。
    • 为了知道网关的 MAC 地址,需要通过 ARP 协议发送 ARP 数据报进行广播,网关路由器接收到该帧后,发现其中的 IP 地址与其接口的 IP 地址匹配,因此就发送一个 ARP 回答报文,包含了它的 MAC 地址,发回给主机。
    • DNS 解析,本地 DNS 缓存——》二级域名服务器——》顶级域名服务器——》根域名服务器,查询到后将结果存入本地 DNS 缓存。
    • HTTP 请求页面,获得对方的 IP 地址,通过 TCP 三次握手建立连接,浏览器解析 HTML 进行渲染。
  • 子网掩码相关知识

IP地址是一个32位的二进制数,但为了方便记忆,通常被分割为4个"8位二进制数",并且用"点分十进制"表示为a.b.c.d的形式,其中a,b,c,d都是0~255之间的十进制整数。

IP的划分

IP地址分为五类,各类可容纳的地址数目不同:

A类保留给政府机构(0.0.0.0到127.255.255.255)

B类分配给中等规模的公司(128.0.0.0到191.255.255.255)

C类分配给任何需要的人(192.0.0.0到223.255.255.255)

D类用于组播(224.0.0.0---239.255.255.255)

E类用于实验(240.0.0.0---247.255.255.255)

A、B、C三类中IP地址=网络地址(我们平时常说的网段)+主机地址,而D、E两类不区分网络地址和主机地址,子网掩码的作用就是划分出一个IP中的网络地址和主机地址。

子网掩码与IP地址一样是32位地址,然后将IP地址与子网掩码进行与运算即可得到网络地址。

IP地址为192.169.10.2,子网掩码为255.255.255.240。
先将十进制转换成二进制:
11000000 10101001 00001010 00000010 (ip地址)
11111111 11111111 11111111 11110000 (子网掩码)
---------------------- 
11000000 10101001 00001010 00000000
则可得其网络标识为192.169.10.0,主机标识为2

一般还有这种表示方式:192.169.10.2/25,代表子网掩码有25个1,即11111111 11111111 11111111 10000000

  • cookie 和 session
    • Cookie:HTTP 的请求是无状态的,所有将服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的 cookie 数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了。
    • Session:session 存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。