事先声明一下,本文所讲的内容,基本来自于 计算机网络自顶向下方法 这本书,和一些自己的理解,这本书有些内容已经陈旧了,所以如有错误,欢迎勘正。
从内容来说,udp相对较少,我们从udp开始讲起。
UDP协议
首先需要声明一下udp最显著的特点是它是一个无连接的协议,那什么是无连接的呢?简单来说就是发送端发完之后就什么都不管了,接收端能不能收得到不在我的考虑范围之内。如果是一个有连接的协议的话,发送端和接收端会维持一个单独的网络端口专门对这一个有连接的请求进行数据处理。从计算机的实际操作来讲:所谓的有连接还是无连接,就是指的是需不需要经过三次握手这一个建立连接的过程。
下面来通过udp的数据报来分析一下udp到底能做些什么事情?
源端口号 | 目的端口号 |
---|
长度 | 检验和 |
---|
应用数据(报文) |
---|
可以看到,udp的报文段里面是带有长度信息的,而且它还有一个经过运算之后得到的一个校验和,校验和计算方式是将比特字求和之后,再位取反。接收端接收到udp数据报的时候,他会去校验udp的数据和校验和能否对的上,以防止中间数据变脏。
但是如果数据变脏了,接收端到底要不要丢弃,不同的udp有不同的实现方式。从这种校验和的有损加工方式可以看得出来,接收端只有校验数据有没有被变更的能力,但是没有纠正的能力。
TCP协议
TCP协议设计的太复杂了,有点不知道从何说起,下面就从整个TCP的生命周期从前到后的顺序讲,先是最老生常谈的三次握手。下面引入一张TCP三次握手的图
三次握手
image.png这边先讲一个基本的约定,默认情况下,发起方是客户端,接收方是服务端。一些TCP报文字段含义:
字段名 | 表示 |
---|---|
URG | 紧急指针是否有效。为1,表示某一位需要被优先处理 |
ACK | 确认号是否有效,一般置为1。 |
PSH | 提示接收端应用程序立即从TCP缓冲区把数据读走。 |
RST | 对方要求重新建立连接,复位。 |
SYN | 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1 |
FIN | 希望断开连接。 |
三次握手过程:
- (1) SYN = 1标志着这是一个发起握手的请求,这个特殊的报文段被称为SYN报文段。之后客户端会随机选择一个初始序号 : x.
- (2) 服务端收到请求,回复SYN = 1,( ACK字段有没有回需要自己抓包确认一下,有的书写的有,有的没写)。然后生成一个自己的初始化序号: y并回复ack = x + 1,标志着收到的是x的连接请求。
- (3) 客户端回复:SYN = 0,标志着连接已经建立,这不是一个建立连接的请求。seq = x + 1,标志着是接着x继续发的,ack = y + 1标志着收到了你的上次序号为y的应答。
三次握手的抓包
为什么要三次握手
谈一个老生常谈的问题,三次握手为什么必须是三次?能不能是两次或者四次?
答案是两次不够,四次冗余,三次是让客户端和服务器端确定双方都已经做好准备的最少的次数。
- 如果是一次握手的话,那么客户端不管服务端有没有收到消息就开始发送,那根本就不用握手了,直接udp就好了。
- 如果是两次握手的话,我们看,实际上第二次握手,服务端返回的信息,实际上有一个作用是确定之后开始发送数据的初始序列号,如果两次握手,就不能就这个初始序列的问题达成一致。
- 四次握手是冗余操作。
- 用白话总结一下三次握手:第1次的握手:客户端说我想跟你建立连接;第2次握手:服务端说我同意了。第3次握手:客户端回服务端:好,我知道了,接下来我要给你发送数据了。
这里贴一个知乎大佬的回答,写的不错:https://www.zhihu.com/question/24853633
流量控制与拥塞控制
流量控制机制和拥塞控制机制是一对相对容易被搞混的概念,流量控制是一个端和端之间的概念,指的是接收端没有能力及时处理发送端发出的字节流,所以要对发送端的每次发送的数据窗口大小作限定。而拥塞控制指的是网络带宽被占光了,如果继续按照当前速度发送的话,就会发生大量的丢包,所以要对发送端的发送速度做限制。
流量控制
接收端接收数据的时候,可能并不会对数据进行立马处理,所以就需要一个缓存去存放着这些收到的数据,如果发送端发送得过快就会造成接收端缓存不够用,由于TCP是全双工的,两端都会发送和接收数据,所以两端都要维持一个接收窗口,这个接收窗口的作用是告诉对方我还有多大的缓存空间,不要传超过这个大小的数据过来。
拥塞控制
拥塞控制一般是在两个层面上做处理的:
- 1 路由器检测到网络拥堵,告诉发送端。
- 2 发送端检测到网络拥堵,自己进行传输控制。
这里主要讲tcp的拥塞控制
快速重传与超时重传
- 超时:TCP超时和重传的基础是:根据给定连接的数据传输往返延时RTT(Round-Trip Time)来设置RTO。 设置一个合理的RTO对于网络整体利用率至关重要。TCP会在传输过程中采样一些数据传输该确认信息所需要的时间的一些样本。每个此类的测量结果称为RTT样本。TCP首先根据一段时间内的样本值建立好的估计值,第二步是基于估计值设置RTO。RTO设置得当是保证TCP性能的关键。 SRTT <- α(SRTT) + (1-α)RTTs。RTO的设置一般大于RTT的2倍
- 快速重传:发送方收到三次接收方发送的冗余ack。例如之前接收方受到了1000,下一次该接收1001了,但是这时他收到了1005,由于tcp的机制,他会一直请求发送方发送1001,发送方在收到三次1001后启动快速重传。
注意:TCP发生重传时会将超时时间设置为之前的两倍,因为网络已经拥堵了,不控制的话网络会更加拥堵。
丢包事件
要么出现超时(超过一定时间没有收到ACK信息),要么收到来自接收方的三次冗余ACK。
拥塞控制算法
首先介绍几个概念:待会用得到,现在不用知道是做什么的
- 拥塞窗口: cwnd,代表着TCP发送流量的速率
- RTT:两端一次往返的时间
- ssthresh:慢启动阈值
拥塞控制算法:
- 初始的时候控制cwnd为1,如果不发生丢包,每次将cwnd扩大两倍,直到第一次丢包发生。
- 发生丢包时,将ssthresh设置为cwnd的二分之一。
- cwnd再从1开始,每次扩大两倍,直到达到ssthresh,开始线性增加,直到遇到超时。
总结: 慢开始,线性增,乘性减
image.png滑动窗口机制
滑动窗口是一个如图所示的窗口: image.png可以分为以下四个部分:
image.png
tcp的发送端的发送窗口大小是由流量控制,拥塞控制决定的,滑动窗口机制和确认重传机制是绑定的,举个例子,接收端发送ack = 56的报文过来,发送端就要从56开始发一定大小的数据过去,当然,这只是个举例,实际上,tcp一次会发多个数据过去。
image.png
学习自:https://www.zhihu.com/question/32255109
小结
滑动窗口 + 流量控制 + 拥塞控制 = TCP维持连接
四次挥手
- 初始状态:客户端A和服务器B之间已经建立了TCP连接,并且数据发送完成,打算断开连接,此时客户端A和服务器B是等价的,双方都可以发送断开请求,下面以客户端A主动发起断开请求为例。(后续内容用A,B简称代替)
- A首先向B发送断开连接消息,这时TCP头部中的FIN标识位值为1,序号是seq=m,m为A前面正常发送数据最后一个字节序号加1得到的,消息发送后A进入FNI_WAIT_1状态,FIN=1的报文段不能携带数据,但要消耗一个序号。
- B收到A的断开连接请求需要发出确认消息,这时TCP头部中的ACK标识位值为1,确认号为ack=m+1,而自己的序号为seq=n,n为B前面正常发送数据最后一个字节序号加1得到的,然后B进入CLOSE_WAIT状态,此时就关闭了A到B的连接,A无法再给B发数据,但是B仍然可以给A发数据(此处存疑),同时B端通知上方应用层,处理完成后被动关闭连接。然后A收到B的确认信息后,就进入了FIN_WAIT_2状态。
- B端应用层处理完数据后,通知关闭连接,B向A发送关闭连接的消息,这时TCP头部中的FIN和ACK标识位值均为1,确认号ack=m+1,自己的序号为seq=k,(B发出确认消息后有发送了一段数据,此处存疑),消息发送后B进入LACK_ACK状态。
- A收到B的断开连接的消息后,需要发送确认消息,这是这时TCP头部中的ACK标识位值为1,确认号ack=k+1,序号为m+1(因为A向B发送断开连接的消息时消耗了一个消息号),然后A进入TIME_WAIT状态,若等待时间经过2MSL后,没有收到B的重传请求,则表明B收到了自己的确认,A进入CLOSED状态,B收到A的确认消息后则直接进入CLOSED状态。至此TCP成功断开连接。
为什么要2MSL呢?因为假如客户端最后一个ack丢失了,那么服务端等到超时会重新发起一个fin请求,这时候最慢传到客户端还是需要一个msl,所以要等待2msl。
课外小知识:
-
DNS协议基于UDP
-
ARP协议:一般被划分到网络层(有争议,也有说数据链路层),是一个建立ip地址和mac地址对应的协议。ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
image.png -
RARP:允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其IP地址。网络管理员在局域网网关路由器里创建一个表以映射物理地址(MAC)和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的IP地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器,此机器就会存储起来以便日后使用。
-
游戏卡顿有什么解决方案吗?
禁用nagle算法,nagle会将数据流集合的尽可能大再发,这样会改善网络的整体状况,但是会引起客户端的延迟。
网友评论