一、UDP协议和TCP协议的特点
UDP:无连接、不可靠传输、面相数据报传输、全双工。
TCP:有链接、可靠传输、面相字节流、全双工。
有无连接:客户端和服务器之间需不需要先建立连接再进行数据传输。
是否为可靠传输:指数据的发送方能否感知到接收方是否接收到数据,不可靠传输不能感知,可靠传输能感知。
面相数据报传输和面相字节流传输:指数据在传输层中是封装成数据报的形式传输还是以字节流的形式传输,
全双工:指数据的传输是双向的。
二、TCP报头
注:并未对所有的字段进行介绍
我们从上往下大概看看这些字段
- 16位源端口、16位目的端口:首先多少位,表示的是使用多少个比特位,源端口表示数据是由哪个端口的程序发送的,目的端口表示数据要由哪个端口的应用接收。
- 32 位序号和 32 位确认序号:这是 TCP 可靠传输非常重要的字段,通过序号确定数据发送的顺序,确认序号作为应答回复给数据发送方,表示已经收到的数据。
- 4 位首部长度:表示的是 TCP 报头的长度,由于选项的存在,TCP 报头的长度并不是确定的,而是变化的。4 位表示的是 4 个比特位,但这 4 个比特位的数据的单位是 4 字节,4 个比特位可存储的数据大小是 0 ~ 15,加上这个单位 TCP 报头的长度范围就是 0 ~ 60 个字节。
- 保留 6 位:这 6 位现在还没有使用,是空出来留作备用。
- URG ~ FIN:这 6 个是标志位,通过将对应的标志位置为 1 来表示这份数据的具体意义。
- 16 位窗口大小:TCP 为了保证可靠连接牺牲了一定的传输速率,而为了弥补这个牺牲,TCP加入了一系列的提速机制,其中就包括采用滑动窗口的方式传输数据,这个窗口大小就是描述滑动窗口的。
- 16位校验和:用来确认数据是否有误。校验和一般有两种:基于数量校验和基于数据内容校验。基于数量就是在发送时记录发送的数据数量,接收方接收到数据后就通过这个数量来进行校验,如果数量对不上,就说明数据有误。基于数据内容比较复杂,举个简单的例子,我们有一种比较特殊的古诗词叫做藏头诗,它的每一句的头一个字连起来可以组成一句完整的、有具体意义的话,我们在默写这种诗词的时候就可以将它的头连起来,如果不能组成之前记住的那句话,就说明默写错了。如上所述,校验和有误说明数据一定有错,但校验和正确并不能说明数据一定没错。
- 16位紧急指针和选项这里不做说明,数据就是 TCP 要传递的数据内容。
三、TCP确认应答以及三次握手和四次挥手
-
确认应答
数据的发送方A在数据发出后,接收方B会在收到数据后做出应答,告知A自己收到了数据。
数据的发送还可能存在后发先至的情况,即A发送了消息M1和M2,B针对M1做出应答R1,针对M2做出应答R2,如果R2后发先至,那么A就有可能会认为R2是对M1做出的应答。
针对这种情况,A在发送时会给消息加上序号,并且不是以消息是第几条作为序号,而是以消息的字节数作为序号,而B在做出应答时,会给应答消息加上应答序号,表示这个应答时针对哪一条消息的。 -
超时重传
超时重传是确认应答的一个补充延伸,A在数据发送后会等待一段时间,如果超过了等待时间还没有收到B的确认信息,A就会认为是数据出现了丢失,并进行数据重传。
这其中又会出现两种情况,一种是数据确实发生了丢失,这时A的重传就没有问题。还有一种情况是B发送的ACK出现了丢失,这时B其实已经收到了数据,A再进行重传,B这边的数据就会重复。
为了避免这种重复,重传的数据在到达B时,B会做出ACK应答,同时这部分数据会先进入一个接收缓冲区,这个缓冲区会根据消息序号来判断消息是否重复,如果不是重复的就接收,重复的就直接丢弃。
一般来说,一次重传就可以保证数据传输成功了,除非是网路环境非常不好,如果一次重传后,A还是没收到ACK,A就会继续重传,但是这一次重传前,A等待的时间就会比第一次要长,如果还要重传,那么之后的等待时间会越来越长,若干次重传失败后,A会认为与B的连接断开了,就放弃继续传输数据。 -
连接管理
三次握手建立连接,四次挥手断开连接。