1、协议:
是网络交互的基础,是一种约定,规范双方的通讯行为用于保证网络传输双方能够正常通讯
2、协议的分层
(1)OSI 七层模型(从上到小的,下一层是为上一层服务的)
- 应用层 :将标准的数据转换成程序需要的格式
- 表示层:将设备的数据格式转化成标准的格式。
- 会话层:用来管理通讯双方之间的会话。
- 传输层:用来确保双方的数据可以正常传输
- 网络层:地址的管理和路由的选择
- 数据链路层:保证相邻节点之间的数据传递
- 物理层:将数字信号传递成为光电信号
(2)TCP/IP 四层模型
- 应用层:常用协议有 —— HTTP(80)、FTP(21)、SSH(22)、TELNET(23)、DNS(53)
- 传输层:常用协议有 —— TCP、UDP
- 网络层
- 数据链路层
3、传输层详解
(1)数据传输的5各要素:
- 1、源地址IP
- 2、源地址端口号
- 3、目的地IP
- 4、目的地端口号
- 5、协议类型
(2)IP地址与MAC地址:
- IP地址的作用是在网络中确定一个位置,IPv4的长度为32位
- MAC的作用是在局域网中确定位置,MAC的长度为48位
(4)UDP传输协议:
(5)TCP传输协议:
- 32位序号和32位确认序号都是为了标识当前TCP的消息的,相当于它的主键,为了在ACK消息应答时使用
- 4位首部长度就是头部的长度
- 6位保留信息中,存放的都是 0 或者 1
-?当ACK等于 1 时,表示这条消息是 客户端 返回给 服务器端 的 确认应答消息 -?SYN 是在三次握手中使用的序列号 -?FIN 是在断开连接四次挥手时 第一次挥手时会加上的信息(第一次挥手时,客户端就会给服务器端发送一个FIN) -?UDG 标识当前数据为一个紧急指针,与后面16位的紧急指针一同起作用,16位的紧急指针用来表示那一部分的数据时紧急数据 -?PSH 告诉接收端,尽快把接收缓冲区中的数据取出来,会发生在拥塞控制 -?RST 复为指针,当网络不稳定的情况下,有可能会去重新建立连接 - 16位窗口大小,指的是接收缓冲区的窗口大小,用作拥塞控制。
当接收端消费能力强的时候,接收缓冲区的窗口是比较大的,反之比较小,它是在不停变化的,所以要每次传输的时候都带上。用于告诉下一次发送消息时,多发还是少发。 - 16位效验和,用于效验发送前和发送后数据的正确性和完整性.
4、TCP十大特性:
1、确认应答:是TCP和UDP最大的区别
- 当有消息发送来之后,我会给你回复一个响应,保障稳定性最关键的措施
2、超时重传:为了解决 消息没有发到服务器端 或 服务器端的响应ACK丢失
- 重传策略:
?a) 动态的重传频率,每一次会在上次的时间上 × 2 ?b) 当重试一定次数之后,还没有成功,就会停止超时重传
3、连接管理(TCP的稳定性保障)
?三次握手
??为什么需要三次握手,两次行吗? ??答:三次握手的主要原因是为了验证客户端和服务器端的手法能力,当二者都具备收法能力才可以(全双工 —— 即要去发送,也要去接受)。由于发送端的发送能力要让接收端来告诉,不能自己和自己验证,所以要经过三次验证才能验证双发的发送和接受能力。如果两次的话,是不能完全验证双方的能力的 ??在三次握手的这个过程中,状态发生了什么变化?交互过程中交互的是哪些数据? ??答:初始情况下,客户端TCP和服务器端TCP都是 CLOSE 状态 ????当客户端TCP启动后,客户端的状态会变成 LISTEN 状态,此时服务器端允许其他的客户端连接它 ????客户端第一次握手时,给客户端发送一个 SYN ,并且自身的状态变成 SYN_SENT(序列号的发送状态),此时服务器端的状态从监听状态就变成为 SYN_RCVD(序列号确认状态) ????服务器端第二次握手,将 SYN 加上 ACK 的确认信息回复给客户端 ????客户端如果接收到信息就会变成 ESTABLISHED 状态,此时会第三次握手,会再发送一个ACK确认信息给服务器端,服务器端接收到这个ACK信息后会变成ESTABLSHED状态 ????此时双放就可以进行通讯了
?四次挥手
??三次握手一定需要三次,但四次挥手不一定需要四次,有可能三次挥手收也能搞定(依赖于TCP的捎带应答特性),当服务器端收到客户端挥手想要断开连接的FIN时,服务器端会查看自己的接收缓冲区,如果此时的接收缓冲区为空,服务器端就可以将返回的应答ACK与下一次要发送的FIN合并为一个请求,捎带的发送给客户端,客户端收到这两个消息后在去发送ACK应答给服务器端,二者就可以断开连接 ??标准的四次挥手流程如下: ????首先,在客户端要和服务器端断开连接时,客户端会发送一个FIN给服务器端,并且将自己的状态从ESTABLISHED变成FIN_WAIT_1(第一次等待断开连接状态) ????然后,服务器端接收到FIN后,就会从 ESTABLISHED 变成 CLOSE_WAIT 状态,然后再去发送一个 ACK 应答给客户端 ????接着,当客户端接收到服务器端发送来的ACK应答后,它的状态就从FIN_WAIT_1变成FIN_WAIT_2,此时服务器端就会等待客户端给他发送彻底断开连接的指令 ????再者,当服务器端处理完接收缓冲区的数任务,会发送一个FIN给客户端,并将自己的状态置于L;AST_ACK(最后一次确认) ????最后,当客户端拿到服务器端给他的FIN后,服务器端就知道客户端已经做好了销毁连接的准备了,此时服务器端会再次发送一个ACK给服务器端,并进入TIME_WAIT状态,且在这这个TIME_WAIT状态上等待两个MSL(最大等待时间),这是为了防止客户端发送给服务器端的响应ACK丢失了,如果客户端ACK丢失了,服务器端会再发送一个FIN各客户端,此时客户端就需要等待两个MSL看看客户端是否正常收到了断开的ACK响应。
4、滑动窗口(高效的进行数据的传递)
滑动窗口是越大越好吗? ??答:当滑动窗口设置的越大,信息在传递的时候吞吐量就越大,一次需要传递的内容就越大,如果传输的信息比较多,而接收端的接受能力比较弱,就会导致接收缓冲区以爆满,会导致信息的舍弃,无法进行消息的应答,导致触发大量的超时重传,形成恶循环.
5、流量控制
??流量控制是会查看接收缓冲区的大小,发送消息时,将这个大小放在消息头中的16位窗口大小中,客户端拿到这个值后,根据这个值决定下次传递多少数据,但它传递的最大值是不会超过滑动窗口的值的 ??当接受大小缓冲区为0时: ???(1)停止消息发送 ???(2)发送检测包,每隔一段时间去询问接受端的接受缓冲区大小
6、拥塞控制
??会根据网络情况决定发送数据的多少
??一开始,不清楚此时网络情况是否良好的情况下,会进行“慢开始”,少量的发送一些数据包试探一下。在发送的过程中的发送速度有一个阈值(ssthresh),假设一开始阈值为16,在未满足阈值之前,发送速度以指数型增长。当到达阈值后,会从指数级变成线性增长的(16,17,18,…),当发送速度逐渐增大直至 出现丢包 的情况时,会将发送速度恢复成初始最小值,此时将丢包时的发送速度的一半作为新的阈值,以此往复
7、延迟应答(提升性能)
??当消息到达服务器端,服务器端首先会查看接收缓冲区的大小,并将服务器端接收缓冲区所剩的大小告诉客户端。但是在这个消息到达客户端的过程冲,有可能服务器端的接收缓冲区中的数据被消费掉了,空间变得更大了;所以要用到延迟应答 ??延迟应答的策略: ????(1)每隔一定次数之后,延迟应答一次; ????(2)每隔一段时间,延迟应答一次; ??**注意事项:**延迟应答的时间(200ms)不能超过超时重传的时间(500ms)。
8、捎带应答(进一步提升性能)
??发送端想要告诉给接收端的消息变多了,合并这些消息,让它进行捎带应答 ??能够实现三次挥手的重要机制。
9、面向数据流
??粘包/半包 问题 ??解决方案: ??(1)以固定的大小的传输包去发送消息(缺点:造成不必要的网络开销) ??(2)使用结束符来明确消息边界。
10、TCP异常处理
??没有缓冲时间异常(断电、断网)【TCP 健康检测机制 —— 多次检测,若是没有检测到在线,就会关闭连接】 ??有缓冲的异常:正常关机【和正常的断开连接是一样的,四次挥手】
面试题:当输入一个URL之后会发生什么?
(1)效验URL正确性 —— 浏览器的行为(不正确则显示错误页面) (2)检测本地缓存 (3)访问DNS服务器,实现域名解析 —— 获得所访问页面的 IP 和 端口号 (4)建立TCP链接(三次握手)。 (5)浏览器会将参数和请求信息发送给服务器端。 (6)服务器得到请求的参数信息,然后再进行业务处理。 —— 服务器端查询数据库/操作数据库 (7)服务器将信息返回个客户端 (8)浏览器拿到响应的信息之后,通过浏览器的执行引擎解析结果并且展示给用户。 (9)TCP是短链接,所以会进行链接断开(四次挥手)
|