网络基础
计算机网络综述
网络分层
- 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()
:向指定的地址发送数据,在调用的参数中应该传入通信对端的地址和端口。