Week8

用户头像
关注
发布于: 2020 年 07 月 29 日

数据结构和算法



网络通信协议





OSI协议七层模型:

每一层都只关注自己关注的东西,把每一层的职责功能共同叠加,构建出整个通讯协议。

物理层:物理层关注的是物理媒介上传输的二进制格式,数据传输本质就是0和1。如何定义0和1,让无线设备发出的电波和光缆中传输的光信号,能相互识别、传输,这是物理层关注的东西。定义的是物理媒介上数据相互识别的规则。

数据链路层:核心职责是地址,无数的网络设备,手机、电脑、很多移动设别。如何知道你的信息要发送到哪一台设备上?对于tcp协议来说,其实就是对应设备的mac地址。还有一些错误检测,及流量控制,都是在链路层做的事情。

网络层:主要做路由选择。

传输层:提供端对端的接口。常用tcp、udp协议。服务器上运行着很多进程,由哪一个进程,去处理用户的请求?由传输层决定。数据包到了服务器以后,如果发送的web请求,默认发送到80端口,服务器交给监听80端口的进程来处理请求。

会话层:保持会话连接

表示层:数据是以字节流的方式传递的。收到数据以后,数据格式转换,加密、解密、压缩、解压缩都在表示层处理。

应用层:把以上一切,打包成一个接口,供给用户使用。



TCP/IP四层模型:

应用层协议:http

传输层:tcp、udp

网络互联层:IP协议,由IP地址实现网络分发

网络访问链路层:链路协议

网络数据包格式:

示例:

如A向B发送一段json数据,先由http协议包装为http格式的数据,再交由下一层,依赖tcp协议,包装为tcp格式,再交由下一层,包装为网络层的包,再交由下一层,包装为网络链路层格式的包。然后通过物理网络传输到B服务器。B接收到后,一层一层拆包。网络链路层拆包后,拿到的是IP的数据。网络层拆包后,拿到的是传输层的数据。这时候检查,你要访问的端口是哪个,调用对应监听端口的进程来处理这段数据。在拆包后,得到的就是http的包。再拆包,就得到了发送的json数据。

可靠的TCP协议:

ip协议不是一个可靠的通信协议,不会建立稳定的通信链路,不会确保数据一定送达。保证通讯可靠,必须依赖传输层协议tcp。

tcp协议是一个面向连接的、可靠的、基于字节流的传输层协议。tcp作为一个比较基础的通讯协议,有很多重要的机制,保证了tcp协议的可靠性。

1.使用序号,对收到的tcp报文进行排序和检测重复数据

2.无错传输,使用校验和检测报文段的错误

3.使用确认和计时器来检测和纠正丢包或者延时

4.流量控制,避免主机发送过快而使接收方来不及完全收下

5.拥塞控制,发送方根据网络承载情况控制分组的发送量,以获得高性能同时避免拥塞崩溃丢失包重传

tcp建立连接三次握手:

tcp关闭连接四次挥手:

http协议是为应用程序服务的,同样层级著名的协议还有ftp协议。

应用层http协议:

7种方法:

get、post、delete、put、head、trace、options

响应5种状态:

1xx:消息已被服务器接收,正在处理

2xx:成功

3xx:重定向,需要后续操作才能完成本次请求

4xx:请求错误,请求含有语法错误

5xx:服务端错误,服务器内部发生异常

http协议版本:

1.0:客户端-服务端,每次会话都会三次握手,四次挥手。频繁创建销毁链接。握手时间是算请求延迟的,挥手不算。

1.1:默认启用长连接模式,客户端可以使用一个tcp链接顺序发送多个请求,新版本也引入了管道机制,客户端可以不用等上一次请求返回的结果,就发送下一个。但是服务端还是按照客户端请求的顺序依次响应。可以理解为半双工模式。

http/2:和复用tcp链接模式不同。依然遵循请求-响应模式。但客户端发送多个请求,和服务端给出多个响应顺序不受限制,这样避免了“队头堵塞”,又能更快获取响应。







非阻塞网络IO

socket连接的基本概念:

当服务端启动后,会有一个程序,调用操作系统暴露的socket接口,bind某个端口。操作系统使当前线程,监听该端口。有人连接后,程序调用accept方法,来读取tcp拆包后的数据。这个时候要注意,第一个连接的程序,这里会出现两个socket。一个是客户端和服务端建立连接的socket。一个是服务器程序自己new出来的监听服务器端口的socket。

这里,accept的时候,这里就开始监听,等待客户端连接,这里就发生了阻塞。socket.getInputStream().read()。这里如果数据没有全部传过来,还是要发生等待,阻塞。socket.getOutputStream().write()。传回数据调用write方法。socket内存大小是有限的,很可能会占满,所以写的时候也可能阻塞。

如何解决?使用多线程

主线程来accept,只用于建立连接。read和write的操作由下面子线程完成。如果阻塞,只阻塞单个线程。

阻塞IO:





物理介质,发送网络包给网卡,网卡解析链路层数据包,判断mac地址是否是本机。

交给操作系统,IP地址包裹tcp数据包。

操作系统处理完以后,将tcp数据部分,写到socket缓冲区。

等待线程来read。

(将网卡中的数据写到socket缓冲区,是操作系统完成的。完成这一操作后,会唤醒线程来处理。当线程写的时候,写到socket发送缓冲区,发完后,操作系统调用来发送数据到网卡,然后发出去。缓冲区满写不进去,会阻塞,缓冲区空,读不到数据,也会阻塞。都会阻塞应用线程。应用来说,只有这两个阻塞点(网络部分))



非阻塞IO:



数据库



总结尚未完成。。。

用户头像

关注

还未添加个人签名 2018.05.02 加入

还未添加个人简介

评论

发布
暂无评论
Week8