OSI七层模型
从下到上:
- 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。透明传输是指尽可能屏蔽掉具体传输介质和物理设备的差异。
- 数据链路层:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。
- 网络层:数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。
- 传输层:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。
- 会话层:组织和协调两个会话进程之间的通信,并对数据交换进行管理。
- 表示层:处理用户信息的表示问题,如编码、数据格式转换和加密解密等。
- 应用层:直接向用户提供服务,完成用户希望在网络上完成的各种工作。
OSI是一个理想的模型,因此一般网络系统只涉及其中的几层,很少有系统能够具有所有的7层,并完全遵循它的规定。
TCP/IP四层模型
从下到上:
- 网络接口层:对应OSI的物理层、数据链路层。
- 网络层:对应OSI的网络层。协议有IP、ARP、RARP等。
- 传输层:对应OSI的传输层。协议有TCP、UDP等。
- 应用层:对应OSI的应用层、表示层、会话层。协议有HTTP、DNS等。
装包/拆包
在TCP / IP协议中数据先由上往下将数据装包,然后由下往上拆包。
在装包的时候,每一层都会增加一些信息用于传输,这部分信息就叫报头,当上层的数据到达本层的时候,会将数据加上本层的报头打包在一起,继续往下传递。
在拆包的时候,每一层将本层需要的报头读取后,就将剩下的数据往上传。
粘包
TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。
防止粘包有3个思路:
- 发送固定长度的消息。
- 把消息的尺寸与消息一块发送。
- 使用特殊标记来表示消息间隔。
TCP建立连接
建立TCP连接需要“三次握手”,是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。
- Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
- Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
- 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个包以确认连接的断开。
- Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
- Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
- Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
- 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,建立起长连接后,都有可能发生连接意外断开,而客户端/服务端不知道的情况。为了在出现这种情况后,立即再次建立连接,就需要心跳机制:每隔一段时间,客户端向服务端发送一个空包,且得到服务端响应,以确保连接正常。
Cookie
Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,在需要时读取的技术。它解决了HTTP无状态特性带来的问题。
客户端在满足下列4个条件时,在请求中带上Cookie:
- 请求的主机名与某个Cookie的Domain属性匹配;
- 请求的端口号在该Cookie的Port属性列表中;
- 请求的资源路径在该Cookie的Path属性指定的目录或子目录中;
- 该Cookie没有过期
Cookie 在请求报头中的形式为:Set-Cookie: name=value。
Session
Session是在服务端保存一个用来跟踪用户状态的数据,这个数据可以保存在集群、数据库、文件中。它也是为了解决了HTTP无状态特性带来的问题,并且解决了Cookie的安全性和容量大小的问题。一般来说不会单独使用Session,同时会在Cookie中保存一个Session ID,每次请求时上报,以实现跟踪用户状态。