计算机网络学习-3
传输层概述
传输层学习两种协议,TCP和UDP协议
TCP协议的作用:
- 可靠传输
- 流量控制
- 拥塞控制
传输层是只有主机才有的层次,传输层可以为应用层提供服务,也可以使用网络层的服务
传输层的功能:
- 传输层提供进程和进程之间的逻辑通信。网络层则提供主机之间的逻辑通信。
- 复用和分用。
- 传输层对收到的报文进行差错检测
- 传输层有两种协议
传输层的寻址与端口
复用:应用层所有的应用进程都可以通过传输层再传输到网络层。
分用:传输层从网络层收到数据后交付指明的应用进程。
端口号标识主机中的应用进程。
端口号长度为16bit,所以能表示的端口号数量为65535个。
端口号的分类:
所以有些程序都会有默认端口号,比如HTTP的80端口,HTTPS的443端口,这里列举出一些协议的端口号:
在网络中采用发送方和接收方的套接字组合来识别端点,套接字唯一标识了网络中的一个主机和它上面的一个进程。
套接字socket=(主机IP地址,端口号)
UDP协议
UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能。
UDP的主要特点
UDP是无连接的,减少开销和发送数据之前的时延。
UDP使用最大努力交付,即不保证可靠交付。
UDP是面向报文的,适合一次性传输少量数据的网络应用。
UDP无拥塞控制,适合很多实时应用,比如一些实时视频之类的,丢失了少量数据也是允许的。
UDP首部开销小,8B(字节),TCP20B(字节)
UDP首部格式
UDP校验过程
伪首部校验
TCP协议
TCP协议的特点
发送数据时,先把一定的字节放入缓存中,然后取一些字节组成报文段然后带上TCP头部组成完整报文段
字节数不是固定的
TCP报文段首部格式
下面是各个部分的作用:
序号:在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号。
确认号:期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已正确收到。
数据偏移(首部长度):TCP报文段的数据起始处距离TCP报文段的起始处有多远以4B位单位,即1个数值是4B。
窗口:指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量。
检验和:检验首部+数据,检验时要加上12B伪首部,第四个字段为6。
紧急指针:URG=1时才有意义,指出本报文段中紧急数据的字节数
选项:最大报文段长度MSS、窗口扩大、时间戳、选择确认…
填充:即将报文首部填充至4B的整数倍
6个控制位
紧急位URG:URG=1时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。
确认位ACK:ACK=1时确认号有效,在连接建立后所有传送的报文段都必须把ACK置为1。
推送位PSH:PSH=1时,接收方尽快交付接收应用进程,不再等到缓存填满再向上交付。
复位RST:RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输链接。
同步位SYN:SYN=1时,表明是一个连接请求/连接接受报文。
终止位FIN:FIN=1时,表明此报文段发送方数据已发完,要求释放连接。
TCP连接管理
TCP连接传输的三个阶段:
连接建立=》数据传输=》连接释放
TCP连接建立
采用三次握手建立TCP连接
seq是序号,ack是确认号
SYN洪泛攻击
SYN洪泛攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。
防范SYN洪泛攻击的方法
可以通过设置SYN cookie
TCP的连接释放
采用四次握手
等待2MSL的目的是为了能够彻底关闭连接
因为若B没有收到确认报文段会在2MSL内重新发送第三个报文段,若A直接关闭了就会收不到重传的报文段,B就会一直重传导致连接无法完全关闭
TCP可靠传输
可靠传输就是保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。
实现可靠传输的机制:
校验
增加伪首部与UDP校验一样,
序号
一个字节占一个序号;序号字段指的是一个报文的第一个字节的序号
一个报文段的字节数取决于MTU(链路层的最大传输单元)
确认
这里发送方要在收到确认报文段之后才会将报文段从缓存中删去,因为可能需要重传。
如果456和78一起发送过去,只收到了78,接受方就会返回ack为4的报文段,发送方就会重传456报文段,如下图:
重传
TCP的发送方在规定时间内没有收到确认报文段就要重传已发送的报文段;也就是超时重传
重传时间的设置就采用了自适应算法,动态改变重传时间RTTs(加权平均往返时间)
不过等待时间过久,还有一种冗余ACK(冗余确认)方法来提高效率
TCP流量控制
流量控制:也就是控制发送速率,使接收方能够完全接收数据
TCP采用滑动窗口机制实现流量控制
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd(接收方设置确认报文段的窗口字段来将rwnd通知给发送方),发送方的发送窗口取接收窗口rwnd和拥塞窗口cwnd的最小值。
TCP拥塞控制
出现拥塞的条件:对资源需求总和>可用资源
拥塞控制就是防止过多的数据注入到网络中。(全局性控制)
拥塞控制还有四种算法:满开始、拥塞避免、快重传、快恢复
现在先假定一下情况来学习这四种算法:
数据单方向传送,而另一个方向只传送确认(就是没有捎带确认,也就是附加数据)
接收方总是有足够大的缓存空间,因而发送窗口大小取决于拥塞程度
发送窗口=Min{接收窗口rwnd,拥塞窗口cwnd}
接收窗口:接收方根据接受缓存设置的值,并告知给发送方,反映接收方容量。
拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量。
慢开始和拥塞避免
慢开始就是逐渐增加注入的报文段,在达到sshresh(慢开始门限)之前以2的指数倍上升,第一次传输1,第二次则2,第三次则4,以此类推,这里在收到确认报文段之后就会立刻改变拥塞窗口大小;到达门限之后就线性增长,这里的图就逐次加一。
检测到网络拥塞之后,cwnd(拥塞窗口)就直接降到一,然后重复前面的过程,但是唯一改变的就是sshresh,是在检测到网络拥塞时,将拥塞窗口除以2作为新的sshresh
快重传和快恢复
快重传就是上面说到的冗余ACK,收到三个重复的确认之后就会执行快重传。
快重传之后执行的就是快恢复,快恢复不会立刻降到拥塞窗口为1,而是降到新的门限值,门限值的大小就是检测到三个重复确认时的拥塞窗口除以2.