计算机网络(五) 传输层

传输层

一、传输层概述

从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。

传输层位于网络层之上,它为运行在不同主机上的进程之间提供了逻辑通信,而网络层提供主机之间的逻辑通信。显然,即使网络层协议不可靠(网络层协议使分组丢失、混乱或重复),传输层同样能为应用程序提供可靠的服务。

传输层的寻址与端口 :

1.端口的作用

端口能够让应用层的各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程。端口是传输层服务访问(TSAP),它在传输层的作用类似于IP地址在网络层的作用或MAC 地址在数据链路层的作用,只不过IP地址和MAC地址标识的是主机,而端口标识的是主机中的应用进程。

数据链路层的 SAP是MAC地址,网络层的 SAP是IP地址,传输层的 SAP是端口。在协议栈层间的抽象的协议端口是软件端口。

2.端口号

应用进程通过端口号进行标识;端口号长度为16bit,能够表示65536(26)个不同的端口号。端口号只具有本地意义,即端口号只标识本计算机应用层中的各进程,在因特网中不同计算机的相同端口号是没有联系的.

二、TCP

1.报文段格式

TCP的全部功能体现在其首部的各个字段中,各字段意义如下:

1)源端口和目的端口。各占2B。端口是传输层与应用层的服务接口。

2)序号。占4B,范围为0~232-1,共232个序号。TCP是面向字节流的,传送的字节流中的每个字节都按顺序编号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。

3)确认号。占4B,是期望收到对方下一个报文段的第一个数据字节的序号。

4)数据偏移(即首部长度)。占4位,这里不是IP数据报分片的那个数据偏移,而是表示首部长度(首部中还有长度不确定的选项字段),它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。

5)保留。占6位,保留为今后使用,但目前应置为0。

6)紧急位URG。当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送。

7)确认位ACK。仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP 规定,在连接建立后所有传送的报文段都必须把ACK置1。

8)推送位PSH(Push)。接收方TCP收到PSH=1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。

9)复位位RST(Reset)。当RST=1时,表明TCP连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

10)同步位SYN。当SYN=1时表示这是一个连接请求或连接接受报文。当SYN=1,ACK=0时,表明这是一个连接请求报文,对方若同意建立连接,则应在响应报文中使用 SYN=1,ACK=1。

11)终止位FIN(Finish)。用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

12)窗口。占2B,范围为0~26-1。它指出现在允许对方发送的数据量,接收方的数据缓存空间是有限的,因此用窗口值作为接收方让发送方设置其发送窗口的依据。

13)校验和。占2B。校验和字段检验的范围包括首部和数据两部分。在计算校验和时,和UDP一样,要在TCP报文段的前面加上12B的伪首部(只需将UDP伪首部的协议字段的 17改成6,UDP长度字段改成TCP 长度,其他的和UDP一样)。

14)紧急指针。占 2B。紧急指针仅在URG=1时才有意义,它指出在本报文段中紧急数据共有多少字节。

15)选项。长度可变。

16)填充。这是为了使整个首部长度是 4B 的整数倍。

2.连接管理

第一步:客户机的TCP 首先向服务器的TCP发送连接请求报文段。这个特殊报文段的首部中的同步位 SYN 置1,同时选择一个初始序号 seq=x。TCP规定,SYN 报文段不能携带数据,但要消耗掉一个序号。这时,TCP 客户进程进入SYN-SENT(同步已发送)状态。

第二步:服务器的TCP收到连接请求报文段后,如同意建立连接,则向客户机发回确认,并为该TCP连接分配缓存和变量。在确认报文段中,把SYN 位和ACK位都置1,确认号是ack=x+1,同时也为自己选择一个初始序号 seq=y。注意,确认报文段不能携带数据,但也要消耗掉一个序号。这时,TCP服务器进程进入SYNRCVD(同步收到)状态。

第三步:当客户机收到确认报文段后,还要向服务器给出确认,并为该TCP 连接分配缓存和变量。确认报文段的ACK位置1,确认号 ack=y+1,序号 seq=x+1。该报文段可以携带数据,若不携带数据则不消耗序号。这时,TCP 客户进程进入ESTABLISHED(已建立连接)状态。成功进行以上三步后,就建立了TCP 连接,接下来就可以传送应用层数据。TCP提供的是全双工通信,因此通信双方的应用进程在任何时候都能发送数据。另外,值得注意的是,服务器端的资源是在完成第二次握手时分配的,而客户端的资源是在完成第三次握手时分配的,这就使得服务器易于受到SYN 洪泛攻击。

第一步:客户机打算关闭连接时,向其TCP发送连接释放报文段,并停止发送数据,主动关闭TCP 连接,该报文段的终止位FIN 置1,序号 seq=u,它等于前面已传送过的数据的最后一个字节的序号加1,FIN 报文段即使不携带数据,也消耗掉一个序号。这时,TCP客户进程进入FIN-WAIT1(终止等待1)状态。TCP是全双工的,即可以想象为一条TCP连接上有两条数据通路,发送FIN 的一端不能再发送数据,即关闭了其中一条数据通路,但对方还可以发送数据。

第二步:服务器收到连接释放报文段后即发出确认,确认号ack=u+1,序号seq=v,等于它前面已传送过的数据的最后一个字节的序号加1。然后服务器进入CLOSE-WAIT(关闭等待)状态。此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态。但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭。

第三步:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时,其发出FIN=1的连接释放报文段。设该报文段的序号为w(在半关闭状态服务器可能又发送了一些数据),还须重复上次已发送的确认号 ack=u+1。这时服务器进入LASTACK(最后确认)状态。

第四步:客户机收到连接释放报文段后,必须发出确认。把确认报文段中的确认位ACK置1,确认号ack=w+1,序号 seq=u+1。此时TCP连接还未释放,必须经过时间等待计时器设置的时间2MSL(最长报文段寿命)后,客户机才进入CLOSED(连接关闭)状态。

3.可靠传输

TCP 使用了校验、序号、确认和重传等机制来达到这一可靠传输的目的。

  • 序号

TCP首部的序号字段用来保证数据能有序提交给应用层,TCP把数据视为一个无结构但有序的字节流,序号建立在传送的字节流之上,而不建立在报文段之上。

如给每个第一个报文段的数据、第二个、第三个 都编上一个序号。

  • 确认

TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。发送方缓存区会继续存储那些已发送但未收到确认的报文段,以便在需要时重传

TCP默认使用累积确认,即TCP只确认数据流中至第一个丢失字节为止的字节。

  • 重传

有两种事件会导致TCP对报文段进行重传:超时和冗余ACK。

(1)超时

TCP 每发送一个报文段,就对这个报文段设置一次计时器。计时器设置的重传时间到期但还未收到确认时,就要重传这一报文段。

(2)冗余ACK(冗余确认)

超时触发重传存在的一个问题是超时周期往往太长。所幸的是,发送方通常可在超时事件发生之前通过注意所谓的冗余ACK来较好地检测丢包情况。冗余ACK就是再次确认某个报文段的ACK,而发送方先前已经收到过该报文段的确认。

4.流量控制

5.拥塞控制


初始时,拥塞窗口置为1,即cwnd=1,慢开始门限置为16,即 ssthresh=16。

慢开始 阶段,cwnd 的初值为1,以后发送方每收到一个确认ACK,cwnd值加1,也即经过每个传输轮次(RTT),cwnd呈指数规律增长。当拥塞窗口cwnd 增长到慢开始门限ssthresh时(即当 cwnd=16 时),就改用拥塞避免算法,cwnd 按线性规律增长。假定cwnd=24时网络出现超时,更新ssthresh值为 12(即变为超时时cwnd值的一半),cwnd重置为1,并执行慢开始算法,当cwnd=12时,改为执行拥塞避免算法。

快重传

当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。

快恢复

三、UDP

1.报文段格式

2.校验

伪首部

在计算校验和时,要在UDP数据报之前增加 12B的伪首部,伪首部并不是UDP的真正首部。只是在计算校验和时,临时添加在UDP数据报的前面,得到一个临时的UDP数据报。校验和就是按照这个临时的UDP数据报来计算的。伪首部既不向下传送又不向上递交,而只是为了计算校验和。

校验流程

发送方首先把全零放入校验和字段并添加伪首部,然后把UDP数据报视为许多16位的字串接起来。若UDP数据报的数据部分不是偶数个字节,则要在数据部分末尾填入一个全零字节(但此字节不发送)。然后按二进制反码计算出这些16位字的和,将此和的二进制反码写入校验和字段,并发送。接收方把收到的UDP数据报加上伪首部(如果不为偶数个字节,那么还需要补上全零字节)后,按二进制反码求这些16位字的和。当无差错时其结果应为全1,否则就表明有差错出现,接收方就应该丢弃这个UDP数据报。

相关推荐
正在走向自律1 小时前
阿里云ESC服务器一次性全部迁移到另一个ESC
服务器·阿里云·云计算
gywl2 小时前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
WTT00112 小时前
2024楚慧杯WP
大数据·运维·网络·安全·web安全·ctf
了一li3 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
杨德杰3 小时前
QT网络(一):主机信息查询
网络·qt
日记跟新中3 小时前
Ubuntu20.04 修改root密码
linux·运维·服务器
唐小旭3 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
明 庭3 小时前
Ubuntu下通过Docker部署NGINX服务器
服务器·ubuntu·docker
BUG 4043 小时前
Linux——Shell
linux·运维·服务器