网络基础

计算机网络综述

网络分层

  • 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建立连接

建立连接三次握手:

  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提交
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流程:

  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():向指定的地址发送数据,在调用的参数中应该传入通信对端的地址和端口。
觉得有用可以请作者喝杯咖啡呀~
0%