iOS网络相关知识
TCP(传输控制协议)
什么是TCP?
回答TCP的特点+功能
特点
- 面向连接
- 可靠传输
- 无差错
- 无重复
- 按序到达
- 面向字节流
- 流量控制
- 拥塞控制
TCP特点
面向连接
- 数据传输开始之前,需要建立连接,三次握手
- 数据传输结束之后,需要释放连接,四次挥手
TCP的三次握手为什么不是两次呢?
- 首先有这样一种场景发送SYN请求的同步报文,如果说在网络路由传输过程中发生了超时,假设没有三次握手只有两次握手。当我们发送的一个SYN同步报文发生了丢失或者说超时的情况下,那么SYN报文在网络路由当中或者网络环境当中逗留了,那么发生超时之后,我们的客户端会启用超时重传策略,重新发送一个SYN同步报文,那么服务端收到同步报文之后,会回复给客户端一个SYN同步报文和ACK同步确认报文,如果说只有两次握手的时候,那么此时我们的TCP连接就已经建立了,假设刚才超时的SYN同步报文此时在服务端给客户端发送的ACK确认报文之后呢又收到了我们超时发送的SYN同步确认报文,那么对服务端来说可能就认为客户端又要建立一次TCP连接,对服务端来说,客户端发送了两次TCP连接,但是实际上是客户端发送的同步报文发生了超时,然后通过超时重传的策略又发送了一遍SYN同步报文,实际上客户端想要建立的只有一次TCP连接,那么我们通过三次握手就能解决这样的问题,比方说当我们客户端发送的SYN同步报文,收到服务端响应的ACK确认报文之后,我们客户端会回传给服务端一个ACK确认报文,此时如果说我们客户端之前发送的SYN确认报文,也就是超时的那个报文又到了服务端,那么达到之后服务端仍然会发送确认报文,那么经过一段时间之后,发现客户端并没有给我们服务端传送ACK确认报文,那么服务端可以认为客户端发送的SYN同步报文实际上是一个超时报文,客户端并没有真正的想建立这个链接,所以说我们需要三次握手,或者说三次握手就是解决这种同步请求连接建立的报文超时的这种场景来规避这种连接建立产生的异常。所以是三次不是两次。
TCP的为什么是四次挥手?
客户端主动发起一个连接释放,那么由客户端发送一个终止服务报文FIN到服务端,服务端回复给客户端一个ACK确认报文,此时由客户端向服务端方向的连接就关闭了,我们称其为半关闭状态,那么在之后服务端仍有数据向客户端发送的话,那么是可以通过服务端向客户端方向的连接进行数据的传送,但是客户端是不能像服务端进行数据的传送的,之后在一定时机内服务端会像服务端发送一个终止确认的一个报文来断开连接,然后客户端发给一个服务端一个ACK确认报文,这里面之所以有两个方向方面的断开通道,实际上是因为客户端与服务端建立的通道是全双工的,全双工指的是一条通道或者是两个端点同时可以进行发送和接收,也就是因为全双工的概念,才需要双方面的连接释放,也就是四次挥手。
可靠传输
TCP是怎样保证可靠传输的?
- 不重复
- 按序到达
- 无差错
- 不丢失
面向字节流
流量控制
TCP什么是滑动窗口协议?
-
我们通过应用程序提交给TCP发送缓存当中的数据都是有字节编号的,我们按照字节编号进行排序,从左到右是一个序号增大的方向,其中已经发送的是一段空间,占发送缓存的一部分空间,其中左端是最后被确认的字节只占已发送的一部分,也就是说我们每次发送的数据最终都需要有服务端的一个确认,来告知这些数据我们已经收到了,也是可靠传输的一个保障,在已发送的右端是最后发送的字节,发送缓存中除去已发送部分剩余的部分是是我将要继续发送的数据,我们的发送窗口是比我们的发送缓存小的,他可能比我们的已发送数据小或者正好等于已发送数据,我们把左侧称之为发送窗口的前沿,右侧称之为发送窗口的右沿,我们的滑动窗口协议实际上我们发送窗口的大小取决于发送缓存的大小,另一方面也是由于接收方的接收窗口的大小来控制,比如说我们接收方现在接收数据的能力比较弱,我们发送方是wifi网络,而接收方是3G网络,他的接收速率特别慢,当他处理不了的时候,我们发送方发送的太快,就会导致接收方的接收缓存会大量累计数据,接收缓存也是有固定大小的,如果说超出大小就会溢出,所以说接收方就需要动态的调整发送方发送窗口的来决定发送方的一个发送速率,发送窗口和接收窗口实际上是两个字段标志位于TCP报文的首部当中,就可以通过相互TCP报文当中的关于窗口值的修改就可以达到动态调整发送方的发送窗口大小的,进而来调整发送方的数据发送速率,这样就体现了发送方的流量控制。
-
接收方也是有接受缓存的,从左到右是序号增大的 其中接受缓存中从左到右首先是按序到达的字节,下一个期望收到的字节 ,未按序到达的字节。这时候我们要想向上层的应用程序去提交响应的数据只能提交按序到达的这一部分,而剩下的一部分必须得等前面部分都达到了保证有序了才能提交,这里面就体现了滑动窗口协议当中对于这种按序到达的这种可靠传输的保证,对于接受窗口来说他是有一个接收窗口大小的,它取决于接收窗口的缓存,接收窗口的大小可以通过TCP报文当中首部中的窗口值来反向制约发送方的发送窗口大小来控制发送速率,我们的按序到达可以通过字节的序号来控制
请简单描述TCP的慢启动特点?
- 慢开始、拥塞避免
- 开始时发送少量报文数据,然后逐步指数增长,达到门限初始值16的时候会使用拥塞避免的策略,然后线性增长到拥塞窗口的最大值,一旦发生网络拥塞,就需要使用乘法减小的策略恢复到只发送一个报文来减小发送报文的数量,减小网络层传输的压力 同时减少门限值,使其达到当初拥塞窗口的一半,当报文数量达到新的门限值时,使用拥塞避免加法增大的策略
- 快重传,快恢复
- 主要是形容网络拥塞后使用乘法减小策略降到新的门限值 而不是降到慢开始的值开始发送,从而达到快重传 快恢复。