网络基础知识

 

OSI七层模型

从下到上:

  • 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。透明传输是指尽可能屏蔽掉具体传输介质和物理设备的差异。
  • 数据链路层:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。
  • 网络层:数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。
  • 传输层:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。
  • 会话层:组织和协调两个会话进程之间的通信,并对数据交换进行管理。
  • 表示层:处理用户信息的表示问题,如编码、数据格式转换和加密解密等。
  • 应用层:直接向用户提供服务,完成用户希望在网络上完成的各种工作。

OSI是一个理想的模型,因此一般网络系统只涉及其中的几层,很少有系统能够具有所有的7层,并完全遵循它的规定。

TCP/IP四层模型

从下到上:

  • 网络接口层:对应OSI的物理层、数据链路层。
  • 网络层:对应OSI的网络层。协议有IP、ARP、RARP等。
  • 传输层:对应OSI的传输层。协议有TCP、UDP等。
  • 应用层:对应OSI的应用层、表示层、会话层。协议有HTTP、DNS等。

装包/拆包

在TCP / IP协议中数据先由上往下将数据装包,然后由下往上拆包。

在装包的时候,每一层都会增加一些信息用于传输,这部分信息就叫报头,当上层的数据到达本层的时候,会将数据加上本层的报头打包在一起,继续往下传递。

在拆包的时候,每一层将本层需要的报头读取后,就将剩下的数据往上传。

粘包

TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。

防止粘包有3个思路:

  1. 发送固定长度的消息。
  2. 把消息的尺寸与消息一块发送。
  3. 使用特殊标记来表示消息间隔。

TCP建立连接

建立TCP连接需要“三次握手”,是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。

  1. Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
  2. Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  3. Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态。随后即可传输数据。

TCP断开连接

断开TCP连接需要“四次挥手”,是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。

  1. Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  2. Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
  3. Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  4. Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态。

UDP和TCP的区别

  • UDP是无连接的,意味着在发送信息前不需要建立连接;TCP是有连接的,意味着要先建立连接再发送信息。
  • UDP不可靠;TCP可靠,无差错,不丢失,不重复,按序到达。
  • UDP支持一对一,一对多,多对一和多对多;TCP只支持一对一。
  • UDP有消息边界保护,发送端发送3个数据包,接收端必须接收3次;TCP没有消息边界保护,发送端发送3个数据包,接收端可以1次接收。所以TCP会出现粘包。

HTTP协议

HTTP协议是一个基于TCP/IP通信协议来传递数据,用于从服务器传输数据到本地客户端的传送协议。

  • HTTP是无连接的:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • HTTP是单工的:这意味着,请求只能由客户端发起,并且一个请求对应一个响应。
  • HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
  • HTTP是无状态的:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTP1.1请求报文提供keep-Alive字段,置为true,则一个连接处理完一个请求后不会断开。

上传文件请求报文

  • 请求方法只能是POST。
  • 报头中的Content-Type:multipart/form-data。
  • Content-Length:文件大小。
  • Content-Disposition:form-data; name=”服务器接收文件数据的key”; filename=”上传服务器后文件的名称”。
  • 报文中的Content-Type: 上传文件的文件类型。可选值有:text/plain、image/jpg、image/png、image/gif、text/html、application/json、application/octet-stream。
  • 请求体为Base64编码的二进制数据。

下载文件请求报文

  • 请求方法只能是GET。
  • GET后面是一个空格,其后紧跟要下载的文件相对于WEB服务器的根目录的路径。

下载文件响应报文

  • Content-Length:文件大小。
  • 响应体为Base64编码的二进制数据。

断点续传

请求报头Range字段用于指定下载文件的某一段大小,及其单位。典型的格式如:

Range: bytes=0-499 // 下载第0-499字节范围的内容。

WebSocket协议

WebSocket是一个基于HTTP的、持久的、全双工的、媒体独立的、无状态的通信协议。

  • 持久的:一个连接处理完一个请求后不会断开
  • 全双工的:客户端可以向服务端发送请求,服务端也可以向客户端发送请求,且可同时进行。

HTTP协议升级为WebSocket协议

客户端首先向服务端发送一个GET请求,在报头中增加5个字段:

  • Upgrade:websocket。
  • Connection:Upgrade。
  • Sec-WebSocket-Key:xxxxxxxxxxx。随机生成的字符串,用于验证服务端的WebSocket。
  • Sec-WebSocket-Protocol:xxxxxxxx。用户定义的字符串,用来区分同URL下,不同的服务所需要的协议。
  • Sec-WebSocket-Version:13。使用的协议版本。

服务端向客户端返回响应,在报头中增加4个字段:

  • Upgrade:websocket。
  • Connection:Upgrade。
  • Sec-WebSocket-Key:xxxxxxxxxxx。
  • Sec-WebSocket-Protocol:xxxxxxxx。

至此HTTP协议就升级为WebSocket协议了。

心跳机制

无论是用HTTP的Keep-Alive,还是WebSocket,建立起长连接后,都有可能发生连接意外断开,而客户端/服务端不知道的情况。为了在出现这种情况后,立即再次建立连接,就需要心跳机制:每隔一段时间,客户端向服务端发送一个空包,且得到服务端响应,以确保连接正常。

Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,在需要时读取的技术。它解决了HTTP无状态特性带来的问题。

客户端在满足下列4个条件时,在请求中带上Cookie:

  • 请求的主机名与某个Cookie的Domain属性匹配;
  • 请求的端口号在该Cookie的Port属性列表中;
  • 请求的资源路径在该Cookie的Path属性指定的目录或子目录中;
  • 该Cookie没有过期

Cookie 在请求报头中的形式为:Set-Cookie: name=value。

Session

Session是在服务端保存一个用来跟踪用户状态的数据,这个数据可以保存在集群、数据库、文件中。它也是为了解决了HTTP无状态特性带来的问题,并且解决了Cookie的安全性和容量大小的问题。一般来说不会单独使用Session,同时会在Cookie中保存一个Session ID,每次请求时上报,以实现跟踪用户状态。