在解释HTTP、TCP和UDP之前的区别之前,先为大家介绍一下三者的含义。
TCP:传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义。
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
UDP:Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。RFC 768 [1] 描述了 UDP。
Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。
HTTPS:超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。
看到这里如果你还不是很理解三者的意思,你可以简单的记住:TCP是一种传输可靠连接的协议;UDP是一种传输不可靠的连接;HTTP是基于TCP的一种超文本连接;下面我会详细的给大家介绍。
TCP连接
为了能实现计算机在因特网之间的数据传输,就需要使用TCP/IP的概念.TCP/IP不是一种协议,而是一个协议族的统称,其中包括IP协议、IMCP协议、TCP协议,以及我们常见的http、ftp协议等。计算机定义了协议,就像两个不同国籍的人之间约定使用国际通用语言交流一样,双方都能准确的理解对方所表达的意思。
上面也介绍了TCP是一种可靠的数据传输连接,那么究竟可靠在哪里呢?首先我们看一下TCP与其他协议的网络结构图。
应用层:应用程序间沟通层,如简单电子邮件传输(SMPT)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
传输层:在此层中,他提供了节点间的数据传输,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
网络接口层(主机-网络层):接收IP数据报并进行传输,从网络上接收物理帧,抽取IP数据报转交给下一层,对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
TCP三次握手
TCP在传输层中由一个确认和重传操作,可以保证我们传输文件的完成性。TCP传输文件在连接之前需要建立连接,这个连接就是三次握手,计算机通过三次握手建立一个持久性、稳定的连接。就像是两个人之间打电话,当电话打通时,两个人就建立起一条持久性的连接,别人是没办法去干扰通话的。
第一次握手:客户主动(activate open)去connect服务器,并且发送SYN假设序列号为J,服务器是被动打开(passive open)。
第二次握手:服务器在收到SYN后,它会发送一个SYN以及一个ACK(应答)给客户,ACK的序列号是J+1,表示是给SYN J的应答,新发送的SYN K 序列号是K。
第三次握手:客户在收到新SYN K,ACK J+1,也回应了ACK K+1以表示收到了,然后两边就可以开始数据发送和接收了。
看到上面的描述,如果你没有学过计算机网络是很难搞懂上面的专业术语的,下面我来详细的说明一下TCP报文结构。
TCP报文结构:
TCP报文格式详解:
- 端口号: 用来标识同一台计算机的不同的应用进程。
- 源端口:源端口和IP地址的作用是标识报文的返回地址。
- 目的端口:端口指明接收方计算机上的应用程序接口。
- 序号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。如果一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400.所以序号确保看TCP传输的有序性。
- 确认号:确认号,即ACK,指明洗一个期待都收到的字节序号,表明该序号之前的所有数据已经确认无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SNY报文的ACK标志位为0。
- 数据偏移/首部长度:4bits。有序首部可能含有可选内容,因此TCP报头的长度是不确定的,报头不包含任何选字段则长度为20字节,4位首部长度字段所标识的最大值为1111,转化为10进制为15,15*32/8=60,所以报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
- 保留:为将来定义新的用途保留,现在一般置0.
- 控制位:URG ACK PSH RST SYN FIN共6个,每一个标志位标识一个控制功能。
- URG:紧急指针标志,为1时标识紧急指针有效,为0时则忽略紧急指针。
- ACK:确认序号标志,为1时标识确认号有效,为0时表示报文中不含确认信息,忽略确认号字段。
- PSH:push标志,为1表示是带有push标志的数据,指示接收放在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
- RST :重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
- SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1.
- FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭奔放数据流。
- 窗口:滑动窗口大小,用来告知发送端接收端的缓存大小,为此控制发送端发送数据的速率,从而达到流量控制。
- 校验和:奇偶校验,此校验和是对整个的TCP报文段,包括TCP头部和TCP数据,以16位字段进行计算所得,由发送端计算和存储,并由接收段惊醒校验。
- 紧急指针:只有当URG标志置1时谨记指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式时发送端像另一端发送紧急数据的一种方式。
- 选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的0,以保证TCP头是32的整数倍。
- 数据部分:TCP报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部,如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
TCP四次挥手
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
第一次挥手:客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。
第一次挥手:服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和 SYN一样,一个FIN将占用一个序号。
第一次挥手:服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。
第一次挥手:客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)
TCP采用四次挥手关闭连接,为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
参考文献:https://www.cnblogs.com/feng9exe/p/8058891.html