文章目录
1 传输控制协议TCP
传输控制协议TCP(Transmission Control Protocol)是一种基于连接的可靠的稳定的无重复的传输协议。
1.1 TCP头部信息
- 16位源端口号(Source Port):发送主机中进程的端口号。
- 16位目的端口号(Destination Port):接收主机中进程的端口号。
- 32位序列号(Sequence Number):每一个包中都包含序列号,序列号被系统初始化为某个随机值ISN。后续的TCP报文段中序号加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025。
- 32位确认号(Acknowledgment Number):目的主机返回确认号,使源主机知道某个或几个报文段已被接收。
- 四位首部长度(Header Length):由于TCP首部包含一个长度可变的选项部分,所以需要这么一个值来指定这个TCP报文段到底有多长。
- URG标志:表示紧急指针(urgent pointer)是否有效。
- ACK标志:表示确认号是否有效。我们称携带ACK标识的TCP报文段为确认报文段。
- PSH标志:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间(如果应用程序不将接收到的数据读走,它们就会一直停留在TCP接收缓冲区中)。
- RST标志:表示要求对方重新建立连接。我们称携带RST标志的TCP报文段为复位报文段。
- SYN标志:表示请求建立一个连接。我们称携带SYN标志的TCP报文段为同步报文段。
- FIN标志:表示通知对方本端要关闭连接了。我们称携带FIN标志的TCP报文段为结束报文段。
- 16位窗口大小(window size):是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口(Receiver Window,RWND)。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
- 16位校验和(TCP check sum):由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保障。
- 16位紧急指针(urgent pointer):是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法。
- TCP头部选项:TCP头部的最后一个选项字段(options)是可变长的可选信息。这部分最多包含40字节。
1.2 TCP运输连接的阶段
- 建立TCP连接
- 数据传输
- 释放TCP连接
1.3 TCP连接的建立
三次握手
第一次握手:
主机A发送位码为 SYN = 1
,随记产生的seq number = x
的数据包到服务器,主机B用 SYN = 1
知道A要建立连接;
第二次握手:
主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq + 1),SYN=1,ack=1
,随机产生seq number = y
的包;
第三次握手:
主机A收到后检查ack number
是否正确,即第一次发送的seq number+1
,以及位码ACK是否为1,若正确,主机A会再发送ack number=(主机B的seq + 1),ack=1
,主机B收到后确认seq
值与ACK=1
则建立连接。
四次挥手
TCP建立连接需要进行三次握手,而断开需要四次,这是由于TCP的半关闭造成的。TCP连接数据可以在两个方向上同时传递,所以关闭时每个方向都要单独进行关闭,这个单方向上的关闭就叫半关闭。
当一方完成传输任务需要关闭时,就发送一个FIN来向另一方通告要终止这个方向的连接。
1)半关闭客户端到服务端的链接:首先客户端A发送一个FIN,用来关闭客户端到服务器的数据传送,然后等待服务器的确认。终止标志位FIN=1
,序列号seq=u
;
2)等待服务器收到这个FIN,服务器发回一个ACK,确认号ack为收到的序号加1
3)半关闭服务官到客户端的连接:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,然后等待客户端的确认;
4)客户端收到FIN后,发回一个ACK报文确认,并将确认序号设置为收到的序号加1。
首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
主机A发送FIN后进入终止等待状态,服务端B收到主机A连接释放报文段后,就立即给主机A发送确认,然后服务器B就进入到colse-wait状态。A到B的连接释放,此时是半关闭状态,即A不可以发送消息给B,但是B可以发送消息给A。此时,若B没有数据发送给A了,其应用进程就通知TCP释放连接,然后发送给A连接释放报文并等待确认。A确认后,进入time-wait,注意,此时TCP连接还没有释放掉,然后经过2MSL后,A才进入到CLOSE状态。
1.4 TCP可靠传输的实现
- 分段传输: 应用数据根据MSS(Maxitum Segment Size 最大分段大小,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460 )值被分割成TCP认为最适合发送的数据段。
- 超时重传: 当TCP发出一个分段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
- CRC校验和: TCP将保持它收不和数据的校验和,如果收到的校验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
- 流量控制: TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP使用的流量控制协议是可变大小的滑动窗口协议。接收方有即时窗口(滑动窗口),随ACK报文发送。(TCP 利用滑动窗口实现流量控制)
- 滑动窗口:
- 累计应答: 接收方在接收到多个数据包后再根据接收到的数据包进行应答,也称为累计确认。
- 窗口: 窗口的实现实际上是操作系统开辟的一个缓存空间,接收方根据实际情况在应答数据包中告知自己的接收窗口大小。窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值(以字节为单位)。发送方主机在等到确认应答返回之前,必须在缓冲区(发送窗口)中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。
- 滑动窗口: 如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。
- 接收窗口为0的处理: 当发送窗口被调整为0后,发送方就不能再发送数据了。这时使用持续计数器,当发送方接收到接收窗口为0的应答报文时马上启动一个持续计时器,当定时达到时主动向接收方发送一个零窗口探测报文,该报文只携带一个字节的数据,然后这种逻辑直到接收方回复的接收窗口大于0。
2 用户数据包协议UDP
用户数据报协议UDP(User Datagram Protocol)是一种无连接的不可靠的传输协议,不需要进行三次握手和四次挥手。
UDP不提供数据包分组、组装和不能对数据包进行排序的缺点,即当报文发送以后,无法得知其是否安全完整到达。
2.1 UDP头部信息
2.2 UDP的应用
使用UDP协议可以进行单播、多播、广播。
- 单播应用:DNS域名解析。
- 多播应用:网络视频会议、教学、视频剪辑等
- 广播应用:ARP数据报广播
3 TCP和UDP的区别
3.1 对比
对比项 | UDP | TCP |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一、一对多、多对一和多对多交互通信 | 只能一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
适用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传播的应用 |
TCP简历连接后需要实时维护改连接,所以TCP所消耗的系统资源比UDP多。
3.2 TCP长连接和短连接
-
长连接: TCP通信双方建立好连接后,在较长一段时间内保持连接,直至某一方主动关闭连接。长连接多用于操作频繁,点对点的通讯。
-
短连接: 通信双方有数据交互时,就建立TCP连接,数据发送完成后,则断开连接。