目录
一、应用层协议
DNS:域名转IP;
NAT:子网IP转公网IP;
NAPT:(子网IP,子网端口)转(公网IP,公网端口)
NAT技术的缺陷:
- 无法从NAT外部向内部服务器建立连接;
- 转换表的生成和销毁都需要开销;
- 通信过程中一旦NAT设备异常,即使存在热备,TCP连接也会断开。
二、传输层重点协议
1、TCP/IP协议
TCP协议段格式:
- 6位标志位(重点了解三个):
【1】ACK:确认应答;
【2】SYN:请求建立连接;
【3】FIN:请求断开连接。- 32位序号和32位确认序号:传输的数据会进行编号,并使用32位序号保存;确认应答时下一次数据存储的位置存储在32位确认应答序号中。
- 16位窗口大小(TCP首部):流量窗口的大小。
- 16位校验和:根据校验和,检验数据的完整性
有些网站下载资源,提供了一种安全的校验方式:sha1、md5
使用头文件信息+内容信息=>基于一定算法,生成一个字符串(进行安全校验)
TCP原理:
保证数据安全传输的前提下,尽可能的提高传输效率。
【1】确认应答机制(安全)
发送的数据,接收端需要返回确认收到的确认应答。
【2】超时重传机制(安全)
发送端超过一定的时间限制,没有接收到ACK应答包,就会进行重传。
存在以下两种情况:
- 发送数据丢包;
- ACK应答包丢包。
如果是第二种情况,接收端会收到很多的重复数据,TCP协议需要能够识别重复的数据并去重(引入序列号即可)。
超时时间的确定:
- 超时时间的长短,随着网络环境的不同是有差异的。如果设置时间太长,会影响传输的效率;太短,会接收到很多的重复数据。
- TCP为了保证在任何环境下都能比较高性能的通信,会动态计算这个时间。超时以500ms为一个单位,每次超时重发倍数以指数的形式增长,累积到一定的次数,TCP会认为出现异常,强制关闭连接。
【3】连接管理机制(安全)
正常情况下,TCP要经过三次握手后建立连接,四次挥手后断开连接。
建立连接:三次握手
建立连接:
- 客户端发送SYN(申请和服务端建立连接);
- 服务端返回ACK+SYN(做出应答并申请建立服务端到客户端的连接);
- 客户端返回ACK(对第二个数据报做出应答)。
断开连接:四次挥手
断开连接:
- 客户端发送FIN到服务端,申请和服务端断开连接;
- 服务端发送ACK响应=>服务端状态置为CLOSE_WAIT;
- 服务端发送FIN到客户端,申请和客户端断开连接=>客户端收到申请后,状态置为TIME_WAIT;
- 客户端返回ACK=>服务端状态置为CLOSED。
存在以下几个问题:
(1)双方的连接状态,为什么到最后才置为closed?
双方都要保证关闭连接,否则的话,如果太早置为closed,可能另一方无法收到对方传来的申请关闭的报文,导致一方连接无法关闭。
(2)第2、3个数据报为什么没有合并?
第二个数据报是系统内核返回的(不需要程序来发送);
第三个数据报是程序调用colse方法进行发送的(服务端在关闭连接前,可能需要做一些其他的工作)。
(3)客户端接收到第三个数据报后,状态置为time_wait,此状态需要等待多长时间?
time_wait的时间是2MSL。MSL是报文最大生存的时间,存在2MSL,保证没有接收到的报文已经消失,同时不存在报文丢失的情况,如果报文丢失,服务端进行重发的话,最长2MSL时间之后就会再次到达客户端。
(4)服务端出现大量的colse_wait,为什么?
服务器上出现大量的colse_wait状态,原因就是服务器没有正确关闭socket,导致四次挥手没有正确完成,只需要调用close方法即可解决问题。
【4】滑动窗口(效率)
作用:以并行的方式发送数据报,减少等待的时间,提高效率。
- 窗口的大小:无需等待确认应答而可以继续发送数据的最大值;
滑动窗口大小=Math.min(流量窗口,拥塞窗口)。- 系统内核需要维护维护这个窗口,开辟发送缓冲区记录哪些数据没有应答;只有确认应答的数据,才能从缓冲区中删掉。
- 串口的大小决定吞吐量·。
发生丢包情况:
- ACK应答包丢失,没有影响,后续的ACK也能表示序号前的全部接收;
- 发送的数据包丢失:
【1】接收的ACK的下一个序号,是接收端接收到的最大值+1(如果中间存在一段数据丢包,连续数值会中断);
【2】快重传:连续三次接收到相同的下一个序号,就表示从下一个序号开始的数据丢包,需要重传。
【5】流量控制(安全)
接收端处理数据的速度有限。如果发送端发送的太快,导致接收端的缓冲区被打满,此时如果继续发送,就会造成丢包,继而引起丢包重传等一系列连锁反应。
TCP会根据接收端的处理能力来决定发送端的发送速度。(接收端将自己可以接收的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK应答包返回给发送端。)
【6】拥塞控制(安全)
网络状况不明的情况下,贸然发送大量的数据报,可能产生网络阻塞。发送端在发送数据之前,先根据拥塞窗口(动态变化)进行探路。
少量的丢包,仅仅是触发了超时重传,大量的丢包,就认为是网络拥塞。当TCP通信开始后,网络吞吐量逐渐上升,随着网络发生拥堵,吞吐量会立刻下降。
【7】延迟应答
如果接收端立即返回ACK应答,这时候返回的窗口可能比较小。(接收端的接收速度可能比较快,读走之后就可以设置更大的流量窗口。所以接收端不是立即返回流量窗口的大小,而是等待一段时间。
延迟通过时间和数量来限制:
- 数量限制:每隔N个包就响应一次;
- 时间限制:超过最大延迟时间就响应一次。
【8】捎带应答(效率)
无论是客户端还是服务端,都可以作为发送端或者接收端。无论是发送端还是接收端,接收到数据后,返回的ACK应答包可以和发送的数据合并在一起发送给对方。
缓冲区
创建一个TCP的socket,同时在内核中创建一个发送缓冲区和一个接收缓冲区:
- 调用write时,数据先写入缓冲区;
- 如果发送的字节数太长,会被拆分成多个数据包发送;
- 如果发送的数据太短,就会先在缓冲区中等待,等到其他合适的时机发送;
- 接收数据时,因为是先放入接收缓冲区;然后应用程序再调用read从接收缓冲区拿数据;
- 对于TCP的一个连接,既有发送缓冲区,也有接收缓冲区,既可以读数据,也可以写数据。
由于缓冲区的存在,TCP程序的读和写不需要一一匹配:
- 写100个字节,可以调用一次write写100个字节,也可以调用100次write,一次写一个字节;
- 读数据也一样。
粘包问题
粘包问题中的包,指的是应用层的数据包:
- 站在传输层的角度,TCP是一个一个报文按照序号排列好放在缓冲区中;
- 站在应用层角度,看到的只是遗传连续的字节数据;
- 此时应用层可能无法分辨数据从哪到哪是一个完整的数据包。(即没有明确的边界)
避免粘包问题:明确包与包之间的边界
- 对于定长的包,按照固定的长度进行读和写;
- 对于变长的包,可以在包头的位置,约定一个包总长度的字段,从而得到包的结束位置。
- 对于变长的包,也可以在包与包之间使用明确的分隔符。
2、UDP协议
【1】UDP协议格式
- 16位UDP长度,表示整个数据报(UDP首部和UDP数据)的最大长度;
- 如果校验和出错,就会直接丢弃。
【2】UDP特点
(1)无连接:只需要知道接收端的IP和端口号就直接进行传输,不需要建立连接。
(2)不可靠:没有任何安全机制,如果因为网络故障无法发送到对方,UDP协议层也不会给应用层返回任何错误信息。
(3)面向数据报:应用层交给UDP多大的数据包,UDP原样发送,既不会拆分,也不会合并。
(4)UDP只有接收缓冲区,没有发送缓冲区(如果接收缓冲区满了,则后面发送的数据就会被丢弃)。
(5)大小受限:UDP协议有一个16位最大长度。也就是说UDP能传输的数据的最大长度是64K(包含UDP首部)。
3、UDP/TCP区别
- UDP无连接,TCP有连接;
- UDP不可靠,TCP可靠;
- UDP是面向数据报,TCP是面向字节流;
- UDP只有接收缓冲区;TCP既有接收缓冲区,也有发送缓冲区;
- UDP大小受限(最大16位),TCP大小不限;
- UDP使用场景(实时性要求高,允许少量丢包),TCP使用场景(可靠性比较高的地方)
三、网络层和数据链路层协议
1、网络层协议
IP协议
2、数据链路层
【1】以太网
以太网:不是一种具体的网路,是局域网的一种技术标准。既包含数据链路层的内容,也包含物理层的内容。
以太网帧:协议格式(在数据链路层封装数据报的格式)。封装以太网帧头(MAC)和帧尾(校验和)。
【2】MTU
以太网的最大传输单元。规定了传输数据的大小,超过以太网规定的最大限制,就会进行分包/分片。
MTU对于IP协议的影响:
- 由于数据链路层MTU的限制,对于较大的IP数据包需要进行分包发送;
- 到达接收端后,再将这些小包按照顺序重组,拼装在一起后返回给传输层;
- 一旦这些小包中任意一个丢失,接收端的重组就会失败,但是IP层不会负责重新传送数据。
MTU对UDP的影响:
小包丢包后,接收端拿到后无法进行重组,整个UDP数据报就无用。
MTU对TCP协议的影响:
- TCP的数据报封装到网络层之后换1是受制于MTU,所以TCP的数据报也不是无限大的。TCP单个数据报的最大长度为MSS(Max Segent Size)
- TCP在建立连接时,通信双方会进行MSS的协商(双方在发送SYN的时候,会在TCP头部写入自己能支持的MSS的值,然后选择最小的作为最终的MSS)。
小包丢包,接收端拿到还是无法进行还原,但TCP有可靠的机制来保证重发=>有一定的影响,但影响不大。
【3】ARP协议
ARP协议是一个介于数据链路层和网络层之间的协议。ARP协议建立主机IP地址和MAC地址之间的映射。
ARP协议的工作流程:
- 源主机发出ARP请求,询问该IP地址的主机的物理地址,并将这个请求广播到本地网段;
- 目的主机接收到广播后,发送一个ARP应答数据包到源主机,将自己的硬件地址填写在应答包中;
- 每台主机都维护一个ARP缓存表。缓存表的表项有过期时间(一般是20分钟),如果该时间内没有再次使用这个表项,则该表项失效,下次还要发ARP请求来获取目的主机的硬件地址。