当前位置: 首页 > Web前端 > HTML5

这篇文章让你了解TCP(一)

时间:2023-04-05 23:30:22 HTML5

前言我们在上一篇文章中谈到了http。我们知道http是建立在tcp之上的。先看图:http是应用层协议,tcp是传输层协议,http是上层。该协议建立在tcp之上。当然你也看到了传输层协议还有一个兄弟叫udp。这个家伙经常被拿来和tcp相提并论。本文不再赘述。如果你想知道,你可以自己学习。好了,我们直接进入正文。tcp传输控制协议(TCP,TransmissionControlProtocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。传输就像是我们购买的快递,通过交通工具送到我们手中。传输就是tcp,tcp交给我们的时候就完成了它的任务,剩下的就是http的事情了,就是传输层协议干的事情。如果真要深究tcp这个东西,恐怕一时半会想不通。那么我们就根据tcp的两个特点:面向连接和可靠来谈谈tcp。这篇文章,我们先来说说tcp的面向连接的特性。什么是面向连接?即通信的双方首先要建立连接通道。说到面向连接,你会想到什么,顺便说一句,它是什么?那?著名的tcp三次握手!!面试官每次面试都会问很多问题吗?就是下图:让我们想象一下三次握手。三次握手的过程可以通过调用来模拟:1、client说:服务器大哥你好,我是client,你能听到吗??2.服务器说:客户大哥你好,我是服务器,我能听到你,你能听到我吗?3.客户端说:服务器大哥,我能听到你的声音。好了,连接建立了,开始聊天吧。。。消息结构先从三次握手说起,我们先来看一个东西:tcp数据消息TCP消息是TCP层传输的数据单元,也叫From报文段,可以看出一个完整的报文结构由两部分组成:报头和数据。SourcePort应用程序在源计算机上的端口号,占16位。DestinationPort目标计算机的应用程序端口号,占16位。seq(SequenceNumber)32位序列号,表示报文段发送数据的第一个字节的序号。在一个TCP连接中,传输的字节流的每个字节都有一个序号seq,这样可以保持传输的有序性。上面的SYN为1时,表示用来同步初始序列号(ISN)。ack(AcknowledgmentNumber)32位的确认序号,表示接收方期望收到发送方下一个报文段中数据的第一个字节的编号。说白了,就是接收方下次发送消息时希望发送方发给我的序号(seq)。标志位标志位表示报文的行为,占1位。本文先讲一下下面四个标志位:SYN同步标志位。当SYN=1时,表示发起了一个新的连接。ACK确认标志,确认号字段(ack)只有在ACK=1时才有效。当ACK=0时,确认号无效,TCP规定连接建立后,ACK必须为1。PSH推送标志位告诉对方收到报文段后是否立即向上层推送数据。如果值为1,则表示数据应该立即提交给上层,而不是缓存起来。FIN标志数据是否已经发送。如果FIN=1,表示数据发送完毕,可以释放连接。Option:选项域,长度可变,TCP头最多可以有40字节的可选信息,用于传输附加信息。Data:该消息携带的数据字段。注意:窗口大小、TCP校验和和紧急指针字段不在本文讨论范围之内。状态说明CLOSED:表示初始关闭状态LISTEN:服务器监听状态(等待客户端连接)SYN_RECEIVED(SYN_RCVD):服务器收到客户端的SYNSYN_SENT:客户端已发送SYNESTABLISHED:表示连接已经建立上面可以理解报文结构和tcp连接过程的几种状态,结合上面三次握手的图片,我们来正式理解一下:三次握手过程1.第一次握手:客户端向服务器发送一个SYN,表示它想要请求连接,并开始进入SYN_SENT状态。2、第二次握手:服务器收到请求后,向客户端回复SYN+ACK,表示确认客户端的请求,此时服务器进入SYN_RCVD状态。3、第三次握手:客户端收到SYN+ACK包,向服务器发送确认ACK包,客户端进入ESTABLISHED状态,服务器收到请求后也进入ESTABLISHED状态,完成三次握手.至此,TCP连接成功,客户端和服务器端开始传输数据。说到这。我相信你也可以和面试官搏斗。你觉得你能说完就握三下手吗?什么?你还太年轻。这时候面试官肯定会说:为什么是三次握手?你不能做两次或四次吗?为什么要进行三次握手?1、判断通信双方是否具备收发能力?如果是第二次握手,可以看上面的三次握手图。第一次握手时客户端发送SYN包给服务器,第二次握手服务器回复ACK+SYN给客户端。Confirmationreplytotheserver这说明对于client来说,client可以确认server的收发能力没有问题。但是如果只是两次握手,那么问题来了,是的,客户端可以确认服务器有发送和接收的能力,但是服务器能不能确认客户端有这个能力呢?无法确认,因为无法得到客户端的确认回复,服务器也不知道发送成功与否。2.确定双方的初始序号其实看图就可以看出来。三次握手的过程实际上就是互相告知初始序列号(ISN)并确认对方已经收到的过程。如果只有两次握手,只能确认client的初始序列号,无法确认server的序列号。出色地。..怎么解释呢?我们知道在tcp中为了维持顺序,消息头需要依赖seq来维持顺序,所以双方在建立连接时必须约定一个初始序号。后续通信依赖这个初始序号来保证字节流具有顺序性。如果不能维持顺序,可能会出现数据丢失,或者乱序导致数据错误等一系列问题,无法在下方播放。既然目标可以实现三次,为什么还有第四次呢?是不是浪费资源?最后,为什么需要三次握手,因为tcp必须是可靠的,无论是判断双方是否具备收发能力还是字节流传输是否保持有序,都是一种体现TCP可靠性。总结本文介绍了tcp,根据tcp面向连接的特点,描述了tcp的三次握手过程和三次握手的必要性。相信你也可以和面试官争论,所以你是不是学业没了?下一篇我们就来聊聊tcp的第二个特性的可靠性,敬请期待!