目录

计算机网络基础

计算机网络综述

网络分层

  • OSI 七层模型,从下往上:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
  • TCP/IP 四层模型,从下往上:
    • 接口层:负责相邻物理设备之间的信息传输,对应物理层和数据链路层;
    • 网络层:为两个主机之间提供通信服务,IP 协议、ICMP(ping)、IGMP 等协议;
    • 传输层:为两个主机的不同端口之间的通信提供服务,TCP 协议和 UDP 协议;
    • 应用层:为用户进程直接提供服务。HTTP(S)、SSH 等协议。

下面如果没有特别说明,都是以 TCP/IP 模型作为描述。

网络设备

  • 集线器:工作在接口层,构成广播域(冲突域);
  • 交换机:工作在接口层,常用于划分 VLAN,可以根据 MAC 地址来定向转发包,而不是广播;
  • 路由器:工作在网络层,根据 IP 进行路由;

IP 地址、域名和 URL

  • IP 地址:32 位二进制数,常用 4 个十进制数字表示,有 ABCDE 五类;

  • 域名:是一个应用层概念,由一串用点分割的名字组成,级别低的域名向左,级别高的域名向右,总长不超过 255 字符;

  • URL:协议]://[主机]:[端口/路径?[参数],其中主机可以是 IP 地址或者域名。

TCP 和 UDP

端口

  • 端口范围是 0~65535,端口是软件级的概念,是传输层的寻址方式。
  • TCP 和 UDP 可以在同一主机上使用相同的端口而互不干扰。
  • 常见默认端口号:
端口号传输层协议解释
25TCPSMTP 简单邮件传输协议
3389TCPWindows Remote Desktop 远程桌面
1521TCPOracle 数据库默认端口
3306TCPMySQL 数据库默认端口
6379TCPRedis 数据库默认端口
7001TCP网络服务器 WebLogic 的默认端口
8080TCP很多开源网络服务器的默认端口,例如 JBoss、Tomcat 等
5432TCPPostgreSQL 数据库的默认连接端口

TCP 协议

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。其特性有:有序性、正确性、可靠性、可控性。

TCP 建立连接

建立连接三次握手:

  1. 客户端发送 SYN,进入 SYN_SENT 状态;
  2. 服务器反馈 SYN+ACK 包,进入 SYN_RECV 状态;
  3. 客户端发送确认包 ACK,客户端和服务器同时进入 ESTABLISHED 状态。

TCP 关闭连接

关闭连接四次握手:

  1. 关闭请求方(例如客户端)发送一个带有 FIN 标记的报文段;
  2. 服务器发送 ACK 确认信号,同时通知应用程序进行清理工作;
  3. 服务器的应用程序完成清理工作后,向客户端发送一个 FIN 报文段;
  4. 客户端向服务器发送 ACK,表示连接彻底释放。

UDP 协议

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,提供面向事物的简单的不可靠信息传送服务。

  • 应用场景:吞吐量大、可以承受信息丢失。
  • 采用的协议:SNMP,NFS,DNS,BOOTP 等。

HTTP

HTTP(HyperText Transfer Protocol,超文本传输协议),是一种用于分布式、协作式和超媒体信息系统的应用层协议。

客户端<–>Web 服务器<–>接口标准 (WSGI/CGI/ISAPI)<–>服务端程序

HTTP 流程

典型流程如下:

  1. 客户端主动建立 TCP 连接;
  2. 客户端发送 HTTP 请求;
  3. 服务端返回 HTTP 结果;
  4. 客户端主动关闭 TCP 连接。

当前 HTTP 版本还允许客户端在一次 HTTP 请求完成后不关闭 TCP 连接,后续 HTTP 请求可以复用该连接,达到减少系统整体开销的目的,此技术在 HTTP 中称为keep-alive

HTTP 消息结构

Request 消息结构

1
2
3
4
5
6
[请求方法] [URL] [协议版本]
[头字段 1]: [值 1]
...
[头字段 N]: [值 N]

[消息体]

Response 消息结构

1
2
3
4
5
6
[协议版本] [错误码] [错误字符串]
[头字段 1]: [值 1]
...
[头字段 N]: [值 N]

[消息体]

HTTP 请求方法

HTTP 方法意义
DELETE从给定的地址中删除信息
GET从访问的地址中获取信息,包括信息头和信息体
HEAD与 GET 的区别是,HEAD 只获取信息头
OPTIONS为客户端提供一种查询“本 URL 地址中有哪些可用的访问方式”的方法
POST向服务器提交新数据,不允许出现重复的 POST 提交
PUTPUT 允许客户端提交重复主键的数据,会用新提交的数据覆盖服务器中已有的数据

Socket

Socket 最初作为 BSD UNIX 的进程通信机制,通常被称作“套接字”。而如今 Socket 已经是操作系统所共同遵守的网络编程标准,用于描述 IP 地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通道,Internet 上的主机一般运行了多个服务软件,同时提供几种服务,每种服务都打开一个 Socket,并绑定到一个端口上,不同的端口对应不同的服务。

Socket 使用 IP 地址+端口+协议 的三元组唯一标识一个通信链路。服务器端的一个通信链路可以对应于多个客户端。

Socket TCP 原语

  • socket():建立 Socket 对象。参数中通常包括使用的传输层协议类型、网络层地址类型等。
  • bind():绑定。在参数中需要传入要绑定的 IP 地址的端口。IP 地址必须可用(绑定 0.0.0.0 时可以监听所有可用 IP。端口必须是一个该 socket 协议未被占用的端口。服务器端程序在listen()之前必须进行bind()操作,而客户端程序如果在connect()前没有bind(),系统会自动为该 Socket 分配一个未被占用的地址和端口。
  • listen():监听。只在服务器端有用,开始坚挺之前绑定的 IP 地址和端口。可以在参数中指定允许排队的最大连接数量。
  • connect()在客户端连接服务器。参数中需要指定服务器的 IP 和端口。
  • accept():接收连接。只在服务器端有用,从监听到的连接中取出一个,并将其包装成一个新的 socket 对象,这个对象可被用于和相应的客户端进行通信。如果当前客户端没有连接请求,则accept()会阻塞等待。
  • send():发送数据。
  • recv():接收数据。如果 Socket 中没有消息可以读取,默认recv()调用会被阻塞直到有消息到达,如果设置为非阻塞模式,recv()以失败形式返回。
  • close():关闭连接。任何一方都可调用,另一方收到后也调用close()关闭连接。

Socket 流程:

  1. 客户端建立 Socket 对象socket()
  2. 服务端建立 Socket 对象socket(),绑定 IP 和端口bind(),开始监听listen()
  3. 客户端连接服务器connect(),服务器接收连接accept()
  4. 客户端与服务端互相发送send() 接收recv()数据;
  5. 关闭连接close()

Socket UDP 原语

除复用 TCP 中的socket()bind()原语之外,UDP 属于自己的原语有:

  • recvfrom():从绑定的地址接收数据;
  • sendto():向指定的地址发送数据,在调用的参数中应该传入通信对端的地址和端口。