计算机网络

TCP的三次握手和四次挥手

三次握手

  1. Client将标志位SYN置为1,随机产生一个值seq=j,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。(第一个SYN
  2. Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=j+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。(第二个SYN + ACK)
  3. Client收到确认后,检查ack是否为j+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。(第三个ACK)

四次挥手

由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

  1. 数据传输结束后,客户端的应用进程发出连接释放报文段,并停止发送数据,客户端进入FIN_WAIT_1状态,此时客户端依然可以接收服务器发送来的数据。
  2. 服务器接收到FIN后,发送一个ACK给客户端,确认序号为收到的序号+1,服务器进入CLOSE_WAIT状态。客户端收到后进入FIN_WAIT_2状态。
  3. 当服务器没有数据要发送时,服务器发送一个FIN报文,此时服务器进入LAST_ACK状态,等待客户端的确认
  4. 客户端收到服务器的FIN报文后,给服务器发送一个ACK报文,确认序列号为收到的序号+1。此时客户端进入TIME_WAIT状态,等待2MSL(MSL:报文段最大生存时间),然后关闭连接。其中MSL是任何报文在网络上存在的最长时间,超过这个时间的报文将被丢弃。等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次挥手的FIN包。

图片理解:

TCP如何保证可靠性

校验和

发送方在发送数据之前计算校验和,填充校验和。接收方收到数据后,再次计算校验和,并和发送方的对比。

序列号和确认应答

TCP传输时对于每一个包进行了编号。ACK可以通过带有对应的确认序列号告诉发送方下一个应该发送报文的序号,如果有丢包会重新发送。接收方也可以根据序列号排序所有的报文,得到正确的数据。

超时重传

如果在确认应答机制中,ACK报文有可能丢失。有两种可能:

  1. 发送方发了,接收方一个都没收到。
  2. 接收方收到了,但是ACK回去的时候丢了。

为了解决这个问题,引入了超时重传。发送方在发送完之后等待一个时间,如果时间结束没有接收到ACK报文,那么就重发一遍。接收方如果收到二次重发的数据,则丢弃,再发一次ACK。这个等待时间是动态计算的。

在Linux中(BSD Unix和Windows下也是这样)超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。重发一次后,仍未响应,那么等待2 x 500ms的时间后,再次重传。等待4 x 500ms的时间继续重传。以一个指数的形式增长。累计到一定的重传次数,TCP就认为网络或者对端出现异常,强制关闭连接

连接管理

三次握手和四次挥手。

流量控制

TCP协议中根据接收端对数据的处理能力,决定发送端的发送速度,这个机制就是流量控制。防止接收端接收太多数据,缓冲区填满之后引发超时重传等机制。

接收方会不停把自己缓冲区剩余大小放在ACK报文中,发送方通过ACK中窗口大小调节自己发送的速度。如果窗口大小为0,则停止发送数据,并定期向接收端发送窗口探测数据段。(心跳检测)

拥塞控制

详细看下方的拥塞控制详解。

CSDN.网络基础:TCP协议-如何保证传输可靠性

TCP的拥塞控制

TCP传输的过程中,发送端开始发送数据的时候,如果刚开始就发送大量的数据,那么就可能造成一些问题。网络可能在开始的时候就很拥堵,如果给网络中在扔出大量数据,那么这个拥堵就会加剧。拥堵的加剧就会产生大量的丢包,产生大量的超时重传,严重影响传输。

慢启动

所以TCP引入了慢启动的机制,在开始发送数据时,先发送少量的数据探路。探清当前的网络状态如何,再决定多大的速度进行传输。这时候就引入一个叫做拥塞窗口的概念。发送刚开始定义拥塞窗口为 1,每次收到ACK应答,拥塞窗口加 1。在发送数据之前,首先将拥塞窗口与接收端反馈的窗口大小比对,取较小的值作为实际发送的窗口,如下公式所述:

这里慢启动不是指报文发送的很慢,而是指发送窗口较小。首先发送1个包,收到回复报文之后,加倍发送窗口,以此类推直到门限值为止。

拥塞避免

慢启动的拥塞窗口增长是指数级别的,为了控制拥塞窗口的增长,不能使拥塞窗口单纯的加倍,设置一个拥塞窗口的阈值,当拥塞窗口大小超过阈值时,不能再按照指数来增长,而是线性的增长。在慢启动开始的时候,慢启动的阈值等于窗口的最大值,一旦造成网络拥塞,发生超时重传时,慢启动的阈值会为原来的一半(这里的原来指的是发生网络拥塞时拥塞窗口的大小),同时拥塞窗口重置为 1

快重传

TCP传输中,如果某一序号的报文丢失,发送方还可以继续发送报文,这时每发一个报文,接收方都会发现当前接收的报文在未接收的报文序列之后,就会要求重传。当发送方接收到3个要求重传的请求报文之后,就不会进行发送方对3号报文的超时重传,而是直接收到了快重传。

快恢复

快恢复算法是在收到三个重复ACK的时候,不直接把cwnd变成1,因为当前只是有个别的报文没有接收到,不需要重置网络传输窗口。

CSDN.TCP拥塞控制(详解)

HTTP1.0/HTTP1.1/HTTP2.0的区别

  1. 1.0和1.1的区别在于长连接的使用,1.0每次请求使用新的TCP连接,之后关闭。1.1实现单个TCP连接可以复用,但是无法并行,2.0增加了多路复用,可以并行发送HTTP请求。
  2. 2.0使用二进制数据帧和流的概念,添加了二进制分帧层。1.0和1.1默认使用文本形式。二进制分帧层在发送过程中,将多个请求分成数据帧和头部帧,且拥有每一个请求的顺序号,在接收的过程中,可以进行组合,这样就可以在一个TCP连接中进行多个HTTP请求的发送。

HTTPS过程

Cookie与Session

Cookie和Session都是来解决http协议中无状态的问题,可以使得当前连接状态被存储。都是用来验证客户端的身份的一种信息,但是这两者的区别主要在以下几点:

  1. Cookie存储在本地,Session存储在服务器上。
  2. Cookie有maxAge,Session是临时性的,当网页关闭时Session立刻消失。

Blog.cookie和session的详解和区别

HTTP中PUT和POST的区别


庄敬日强,功不唐捐。