TCP简记

作为一个非科班的前端er,计算机网络基础和原理方面一直都是自己比较薄弱的环节,最近学习了一些相关的知识便记录一下。

简介

tcp/ip:我们通常所说的tcp/ip协议,指的是以TCP(传输控制协议)和IP(网际协议)为核心的TCP/IP协议族。TCP/IP也称互联网协议,是一个网络通信模型,以及一整个网络传输协议家族,为互联网的基础通信架构。

计算机网络体系结构的分层

根据不同的模型,我们将计算机网络中的协议分为不同的层级。最常见的有OSI七层参考模型和TCP/IP四层模型。

数据的传输

互联网协议规定了数据(包)的发送从上层到下层,每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,明确标明了协议应该如何读取数据。

数据的接收则从下层到上层,每个分层中,都会对接收的数据进行处理,根据包首部,了解该协议的必要信息以及要处理的数据。

下图以用户a向用户b发送邮件为例子:

TCP连接中的三次握手与四次挥手

TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端间的准备工作。

三次握手

所谓三次握手是指建立一个TCP连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。

  • 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。

  • 第二次握手:服务器端接收到数据包后由标志位SYN=1知道客户端请求建立连接,服务端将标志位SYN和ACK都设置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。

  • 第三次握手:客户端接收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,
    ACK是否为1,如果正确则连接建立成功,客户端和服务器进入ESTABLISHED状态,完成三次握手,随后客户端与服务器之间可以开始传输数据了。

四次挥手

四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务器端总共发送四个数据包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。

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

  • 中断连接可以是客户端,也可以是服务端

  • 第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态。意思是我(客户端)没有数据要发给你了,但如果你服务端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。

  • 第二次挥手:服务端接收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但我还没准备好,请你继续等待我的消息。这个时候客户端就进入FIN_WAIT_2状态,继续等待服务器端的FIN报文。

  • 第三次挥手:当服务端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端我这边的数据已经发完了,准备好关闭连接了。服务端进入LAST_ACK状态。

  • 第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务端不知道要关闭,所以发送ack=N+1进入TIME_WAIT状态,如果server端没有收到ACK则可以重传。服务端接收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有得到回复,则证明服务端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。

实际上还可能会出现同时发起关闭的情况:

通过序列号与确认应答提高可靠性

  • 在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大。

  • 在一定时间内没有等待到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。

  • 未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。这种情况也会导致发送端误以为数据没有到达目的地而重发数据。

  • 此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也屡见不鲜。此时,源主机只要按照机制重发数据即可。

  • 对于目标主机来说,反复收到相同的数据是不可取的。为了对上层应用提供可靠的传输,目标主机必须放弃重复的数据包。为此我们引入了序列号。

  • 序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据 TCP 首部中的序列号和数据的长度,将自己下一步应该接收的序列号作为确认应答返送回去。通过序列号和确认应答号,TCP 能够识别是否已经接收数据,又能够判断是否需要接收,从而实现可靠传输。

重发超时的确定

  • 每次发包之前都会计算往返时间,以此确定超时间隔

  • 重发之后可能再次重发,超时间隔以指数形式增加 2 - 4 - 8

  • 重发多次之后将强制断开连接,不会无限重发

猜你喜欢

转载自www.cnblogs.com/formercoding/p/12945040.html