# 02 网络理解

## 一:网络层级结构

### TCP/IP四层结构

* 应用层
* 传输层
* 网络层
* 网络接口层

### OSI七层网络结构

* 应用层
* 表示层
* 会话层
* 传输层
* 网络层
* 数据链路层
* 物理层

## 二:HTTP协议-超文本传输协议

> `应用层`面向对象的协议 常基于`TCP`链接方式

* 特点:
  * 支持客户端/服务端模式
  * 简单快捷灵活
  * 客户端每次发送的请求,都需要服务器回送响应,请求结束后主动释放链接.俗称`短连接`

## 三:TCP协议

> `传输层` 提供面向链接的可靠的字节流服务,提供`超时重发`,`丢弃重复数据`,`校验数据`,`流量控制`等功能 在正式收发数据前,需要建立三次握手建立可靠的链接

* 三次握手
  * 客户端向服务器发送一个SYN报文(syn=j),计入`SYN_SEND`状态,等待服务器确认
  * 服务器接收到客户端的SYN报文,确认客户端的SYN(ack=j+1),同时自己也发送一个SYN报文(syn=k),即`SYN+ACK`报文,服务器进入`SYN_RECV`状态
  * 客户端收到服务器的`SYN+ACK`报文,向服务器发送确认报文ACK(ack=k+1),此包发送完毕,客户端服务端进入`ESTABLISHED`状态,完成三次握手

## 四:UDP协议

> `传输层` 面向非链接,不保证可靠性的数据传输协议,没有超时重发等机制,故传输速度很快 不与对方建立连接,直接把数据包丢过去,所以适合少量数据且可靠性要求不高的场景

## 五:Socket

IP地址+端口=Socket

> 应用程序通过`Socket`向网络发送请求或响应 它是一个针对TCP/UDP编程的接口,基于它建立TCP/UDP连接. `Socket`连接就是所谓的长连接,一旦建立起连接,不会主动断掉

## 六:HTTP-Socket-TCP 的关系

1. HTTP协议提供了封装或者显示数据的具体形式
2. Socket连接提供了网络通信的能力
3. TCP连接提供如何在网络中传输
4. socket是纯C语言的,跨平台
5. HTTP协议是基于socket的,底层使用的就是socket
6. 创建Socket连接时，可以指定使用的传输层协议(TCP或UDP),当使用TCP协议进行连接时，该Socket连接就是一个TCP连接

## 七:TCP/UDP的区别

1. 基于连接和无连接
2. TCP对系统资源占用较多,UDP较少
3. UDP程序结构简单
4. TCP是字节流数据类型,UDP是用户数报文类型
5. TCP保证数据可靠性,UDP不保证,可能丢包

## 八.Socket工作流程

* 服务端创建一个socket
* 绑定服务器主机地址,监听一个端口
* 调用accept函数，一致初一阻塞状态
* 当客户端有客户端请求，并自己进入阻塞，一直到服务返回数据
* 服务端保存客户端的socket，然后向客户单的socket 写入数据
* 客户端接收后可以发送close消息断开链接，那么就完成一次完成的socket交流

## 九:HTTP和Socket的区别

* `HTTP连接`是短连接,`Socket连接`是长连接
  * 尽管`HTTP1.1`开始支持持久链接但仍无法保证始终链接
  * Socket建立TCP三次握手后,除非一方自动断开链接否则链接将一直保持
* `HTTP`服务端无法主动发送消息
  * 采用`请求-响应`机制
* 应用场景
  * HTTP
    * 双方不需要同时保持在线,如客户端资源获取,上传等
  * Socket
    * IM APNs等
