文章目录
传输层
1.传输层的作用
传输层的作用是为应用层提供通信服务,使用网络层的服务。
TCP/IP为上层应用提供了两个不同的运输层协议,即
(1) 用户数据报协议(User Datagram Protocol,UDP),UDP在传输数据之前不需要建立连接
(2)传输控制协议(Transport Control Protocol,TCP),TCP提供面向连接的服务
传输层的复用和分用:
复用(Multiplexing):在发送方不同的应用进程都可以使用同一个传输层协议传送数据(需要加上适当的首部)
分用(Demultiplexing):指接收方的传输层在剥去报文的首部后能把这些数据正确交付到目的应用进程。
多个程序同时发消息给一台电脑,电脑如何准确的把这些消息给到不同程序的端口?
传输层从IP层收到数据后必须交付给指明的应用进程。传输层要正确的将数据交付给指定应用进程,就必须给每个应用进程赋予一个明确的标志。在TCP/IP网络中,使用一种与操作系统无关的协议端口号(Protocol Port Number)(简称端口号)来实现对通信的应用进程的标志。分用时,找不到对应的目的端口号,就给发送方发送ICMP“端口不可达”的差错报告报文。
一、用户数据报协议(UDP)
1.概述
用户数据报协议UDP只在IP的数据报服务之上增加了有限的功能,这就是端口的功能(有了端口,传输层就可以进行复用和分用)和差错检测的功能。UDP用户数据报只能提供不可靠的交付,但是优点也是有的:
- UDP是无连接的,即发送数据之前不需要建立连接,结束也没有可释放的连接,因此减少了开销和发送数据之前的时延。
- UDP使用尽最大努力交付,即不保证可靠交付,同时也不使用流量控制和拥塞控制,因此主机不需要维持具有许多参数的、复杂的连接状态表
- 由于UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。适合实时会议等
- UDP是面向报文的,也就是应用程序交给UDP一个报文,UDP就发生一个报文,并不会将报文分组发送,所以应用程序得选择合适大小的报文。适合一次性传输少量数据的网络应用
- UDP支持一对一、一对多、多对一和多对多的交互通信
- 用户数据报只有8个字节的首部开销,比TCP的20个首部字节要短得多。
2.UDP报文的首部格式
UDP报文有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节,由4个字段组成,每个字段都是两个字节。
(1)源端口 源端口号
(2)目的端口 目的端口号
(3)长度 UDP用户数据报的长度
(4)检验和 差错检验码,防止UDP用户数据报在传输中出错
UDP校验
伪首部只有在计算检验和时才出现,不向下传送也不向上递交
17:封装UDP报文的IP数据包首部协议字段是17
UDP长度:UDP首部8B+数据部分长度(不包括伪首部)
二、TCP协议
1.概念及特点
TCP是传输控制协议,位于传输层。
特点:
- TCP是面向连接的传输层协议
- 每一条TCP连接只能由两端点(IP地址、端口号),点对点的连接
- TCP提供可靠交付的服务,不丢不重可靠有序
- 提供全双工通信
- 面向字节流。流指的是流入到进程或从进程流出的字节序列
TCP和UDP 的区别:
-
TCP是面向连接的(传输前需建立连接),UDP是无连接的(传输前不需要建立连接)
-
TCP提供可靠的服务。通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制
-
UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信
-
每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
-
TCP对系统资源要求较多,UDP对系统资源要求较少
2.TCP—>报文段首部解析
TCP协议的报文段分为两段,分别是首部和数据两部分。TCP协议的核心主要是在首部,只有搞清楚首部个字段的意义,才能掌握TCP的工作原理。
TCP报文段首部的前20个字节是固定的,后面又4N个字节是根据需要增加的选项(N必须为整数),因此TCP首部的最小长度是20字节。
首部个字段的意义如下:
- 源端口和目的端口:各占两个字节,与UDP一样,该字段定义了在主机中发送和接收该报文段的应用程序的端口号,用于传输层的复用和分用
- 序号:占4个字节,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号
- 确认号:期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已经正确收到
- 数据偏移(首部长度):TCP报文段的数据起始处距离TCP报文段的起始处有多远,以4B为单位,即一个数值是4B
- 紧急位URG:URG =1时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传输,不在缓存中排队,配合紧急指针字段使用
- 确认位ACK: ACK=1时确认好有效,在连接建立之后所有传送的报文都必须将ACK置为1
- 推送位PSH:PSH=1时,接收方尽快交付接收应用进程,不在等到缓存填满再想上交付
- 复位RST:RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输连接
- 同步位SYN:SYN=1时,标明是一个连接请求/连接接收报文
- 终止位FIN:FIN=1时,表明此报文段发送方数据已发送完毕,要求释放传输连接
- 窗口:指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量,根据接收方的窗口大小来限制/调整发送方传输数据的大小
- 检验和:检验首部+数据,检验时要加上12B伪首部,第四个字段为6
- 紧急指针:URG=1时才有意义,指出本报文段中紧急数据的字节数
- 选项:最大报文段长度MSS、窗口扩大、时间戳、选择确认…
3.TCP的连接建立(三次握手)
加入运行在一台主机(客户)上的某一个进程想与另一台主机(服务器)上的一个进程建立一条连接 ,客户应用进程首先通知客户TCP,他想建立一个与服务器上某个进程之间的连接,客户中的TCP会用以下步骤与服务器中的TCP建立一条TCP连接:
A统称为客户端,B统称为服务器端
1.客户端发送连接请求报文段,不携带应用层数据
SYN=1,seq=x(随机) : 同步位SYN:SYN=1时,标明是一个连接请求/连接接收报文,seq是序号
2.服务器端接收到连接请求报文,为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,不携带应用层数据。因为TCP是全双工通信,所以客户端和服务器端都各自有两个缓存,作于发送和接收使用。
SYN=1,ACK=1,seq=y(随机),ack=x+1,x为连接请求中的seq,因为ack是期待下一次接收的报文段的第一个字节的序号,所以ack=x+1
3.客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据
SYN=0,ACK=1,seq=x+1,ack=y+1
了解:SYN泛洪攻击
SYN泛洪攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,就会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而小号CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。
解决方法:SYN cookie
预防半连接攻击,SYN-Cookie是一种有效的机制,它的基本原理非常简单,那就是“完成三次握手前不为任何一个连接分配任何资源”。
有兴趣的可以自己去查找资料。
4.TCP的连接释放(四次挥手)
参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的“资源”(缓存和变量)将被释放。
A统称为客户端,B统称为服务器端
1.客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。
FIN=1,seq=u
FIN是终止位标志,当FIN=1时表明此报文段发送方数据已发送完毕,要求释放传输连接
2.服务器端回复一个确认报文段,客户端到服务器这个方向的连接就释放了—半关闭状态
ACK=1,seq=v,ack=u+1
ACK是确认位,seq取决于上一次发送到哪里,这里seq=v,那么服务器上一次发送的报文段最后一个字节为v-1
客户端到服务器这边的连接释放了,不能再发送数据,但可以发送确认消息,但是服务器到客户端的连接并没有释放,所以还可以继续向客户端发送数据,这种现象就是半关闭状态
3.服务器端发送完数据,就发出连接释放报文段,主动关闭TCP连接
FIN=1,ACK=1,seq=w,ack=u+1
seq取决于在第二步之后发送了多少数据(如果在半关闭的状态下,服务器端没有发送过数据,那么seq=v)
4.客户端回复一个确认报文段,在等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭。
ACK=1,seq=u+1,ack=w+1
客户端的TCP并不能马上释放整个连接,还要再等待一个超时时间才能将整个连接释放。因为客户端的确认有可能丢失,这是服务器端会重传FIN报文段,在这段超时时间内,若客户端又收到服务器端重传的FIN报文段,客户端需要再次进行确认,收到客户端的最后确认,服务器端才能最终将整个连接释放。若等待的这段超时时间内没有收到服务器端的FIN报文段,客户端的TCP则向其应用进程报告,整个连接已经全部释放。
5.为什么TCP可靠传输,哪些方法保证可靠
-
确认和重传机制
建立连接时三次握手同步双方的“序列号 + 确认号 + 窗口大小信息”,是确认重传、流控的基础。
传输过程中,如果Checksum校验失败、丢包或延时,发送端重传。 -
数据排序
TCP有专门的序列号SN字段,可提供数据re-order -
流量控制
滑动窗口(之后再详细讲)和计时器的使用。TCP窗口中会指明双方能够发送接收的最大数据量,发送方通过维持一个发送滑动窗口来确保不会发生由于发送方报文发送太快接收方无法及时处理的问题。 -
拥塞控制
TCP的拥塞控制由4个核心算法组成:
慢启动(Slow Start)
拥塞避免(Congestion avoidance)
快速重传 (Fast Retransmit)
快速恢复(Fast Recovery)