计算机网络基础
计算机网络综述
网络分层
- 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 可以在同一主机上使用相同的端口而互不干扰。
- 常见默认端口号:
端口号 | 传输层协议 | 解释 |
---|---|---|
25 | TCP | SMTP 简单邮件传输协议 |
3389 | TCP | Windows Remote Desktop 远程桌面 |
1521 | TCP | Oracle 数据库默认端口 |
3306 | TCP | MySQL 数据库默认端口 |
6379 | TCP | Redis 数据库默认端口 |
7001 | TCP | 网络服务器 WebLogic 的默认端口 |
8080 | TCP | 很多开源网络服务器的默认端口,例如 JBoss、Tomcat 等 |
5432 | TCP | PostgreSQL 数据库的默认连接端口 |
TCP 协议
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。其特性有:有序性、正确性、可靠性、可控性。
TCP 建立连接
建立连接三次握手:
- 客户端发送 SYN,进入 SYN_SENT 状态;
- 服务器反馈 SYN+ACK 包,进入 SYN_RECV 状态;
- 客户端发送确认包 ACK,客户端和服务器同时进入 ESTABLISHED 状态。
TCP 关闭连接
关闭连接四次握手:
- 关闭请求方(例如客户端)发送一个带有 FIN 标记的报文段;
- 服务器发送 ACK 确认信号,同时通知应用程序进行清理工作;
- 服务器的应用程序完成清理工作后,向客户端发送一个 FIN 报文段;
- 客户端向服务器发送 ACK,表示连接彻底释放。
UDP 协议
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,提供面向事物的简单的不可靠信息传送服务。
- 应用场景:吞吐量大、可以承受信息丢失。
- 采用的协议:SNMP,NFS,DNS,BOOTP 等。
HTTP
HTTP(HyperText Transfer Protocol,超文本传输协议),是一种用于分布式、协作式和超媒体信息系统的应用层协议。
客户端<–>Web 服务器<–>接口标准 (WSGI/CGI/ISAPI)<–>服务端程序
HTTP 流程
典型流程如下:
- 客户端主动建立 TCP 连接;
- 客户端发送 HTTP 请求;
- 服务端返回 HTTP 结果;
- 客户端主动关闭 TCP 连接。
当前 HTTP 版本还允许客户端在一次 HTTP 请求完成后不关闭 TCP 连接,后续 HTTP 请求可以复用该连接,达到减少系统整体开销的目的,此技术在 HTTP 中称为keep-alive
。
HTTP 消息结构
Request 消息结构
|
|
Response 消息结构
|
|
HTTP 请求方法
HTTP 方法 | 意义 |
---|---|
DELETE | 从给定的地址中删除信息 |
GET | 从访问的地址中获取信息,包括信息头和信息体 |
HEAD | 与 GET 的区别是,HEAD 只获取信息头 |
OPTIONS | 为客户端提供一种查询“本 URL 地址中有哪些可用的访问方式”的方法 |
POST | 向服务器提交新数据,不允许出现重复的 POST 提交 |
PUT | PUT 允许客户端提交重复主键的数据,会用新提交的数据覆盖服务器中已有的数据 |
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 流程:
- 客户端建立 Socket 对象
socket()
; - 服务端建立 Socket 对象
socket()
,绑定 IP 和端口bind()
,开始监听listen()
; - 客户端连接服务器
connect()
,服务器接收连接accept()
; - 客户端与服务端互相发送
send()
接收recv()
数据; - 关闭连接
close()
。
Socket UDP 原语
除复用 TCP 中的socket()
和bind()
原语之外,UDP 属于自己的原语有:
recvfrom()
:从绑定的地址接收数据;sendto()
:向指定的地址发送数据,在调用的参数中应该传入通信对端的地址和端口。