//图片取自王道,仅做交流学习
一、传输层提供的服务
物理层、数据链路层、网络层是通信子网。
传输层:它属于面向通信部分的最高层,同时也是用户功能的最低层
为应用层提供通信服务使用网络层的服务
网络层提供主机之间的逻辑通信。
1、传输层的功能:
1.传输层提供进程和进程之间的逻辑通信(即端到端通信 )。网络层提供的主机到主机之间的通信
2.复用和分用
复用:发送方不同的应用进程都可以使用同一个传输层协议传输数据;
分用:接收方的传输层在剥去报文的首部之后能正确的把这些数据交付到目的进程。
3.传输层对收到的报文进行差错检测
4.传输层的两种协议
面向连接的TCP 和无连接的UDP。
面向连接的传输控制协议TCP
尽管下面的网络是不可靠的(只提供最大努力的服务),但是这种逻辑信道就相当于一条全双工的可靠信道。
传送数据之前必须建立连接,数据传送结束后要释放连接。不提供广播或多播服务。由于TCP要提供可靠的面向连接的传输服务,因此不可避免增加了许多开销:确认、流量控制、计时器及连接管理等。可靠,面向连接,时延大,适用于大文件。
无连接的用户数据报协议UDP
传送数据之前不需要建立连接,收到UDP报文后也不需要给出任何确认。
不可靠,无连接,时延小,适用于小文件。
逻辑信道不可靠。
2、传输层的寻址与端口
端口
能让应用层各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文中的数据向上通过端口交付给应用层的进程。
它 是传输层的SAP,它在传输层的作用类似于IP地址在网络层,MAC地址在数据链路层的作用。只不过IP地址和MAC地址标识主机,而端口标识的是主机中的应用进程。
端口是传输层的SAP(服务访问点 Service Access Point)
端口号只有本地意义,在因特网中不同计算机的相同端口是没有联系的。
端口号长度为16bit (2个字节),能表示65536个不同的端口号。
登记端口,比如Tomcat 8080, Mysql:3306, redis 6379,RabbitMQ 5672
在网络中采用发送方和接收方的套接字组合来识别端点,套接字唯一标识了网络中的一个主机和它上面的一个进程。
套接字socket= (主机IP地址,端口号)
3、无连接服务与面向连接服务
面向连接的服务就是在通信双方进行通信之前,必须先建立连接,整个连接的情况一直被实时监控和管理。通信结束之后,应该释放这个链接。
无服务链接是指两个实体之间的通信不需要先建立好连接,需要通信的时,直接将信号发送到"网络"中,让该信息的传递在网上尽力而为的往目的地传送。
TCP是面向连接的,向上提供了一条逻辑上全双工的可靠的信道,适合可靠性要求较高的场景,如FTP,HTTP,TELNET。TCP 提供确认、流量控制、计时器及连接管理等,开销较大。
UDP是无连接的非可靠传输协议,简单,速度快,实时性好。适合小文件传输 TFTP,DNS,SNMP和实时传输协议RTP都是基于DNS。
二、UDP
1、UDP数据报
UDP只在IP数据报服务之上增加了很少功能:复用分用 和 差错检测功能。
UDP的主要特点:
1.UDP是无连接的,减少开销和发送数据之前的时延。
2.UDP使用最大努力交付,即不保证可靠交付。
3.UDP是面向报文的,适合一次性传输少量数据的网络应用。
4、UDP无拥塞控制,适合很多实时应用。
5.UDP首部开销小,8B,TCP 20B。
6、UDP支持一对一,一对多,多对一,多对多的交互通信。
应用层给UDP多长的报文,UDP就照样发送,即一次发一个完整报文。
UDP报文格式
UDP报文=UDP首部 + 用户数据。
UDP首部4个字段,共8个字节,每个字节的长度都是2B。
1)源端口。源端口号。在需要对方回信时选用,不需要时可用全 0。
- 目的端口。目的端口号。这在终点交付报文时必须使用到。
3)长度。UDP 数据报的长度(包括首部和数据),其最小值是 8(仅有首部)。
4)校验和。检测 UDP 数据报在传输中是否有错。有错就丢弃 。该字段是可选的,当源主机
不想计算校验和时,则直接令该字段为全 0。
伪首部只有在计算检验和时才出现,不向下传送也不向上递交
17:封装UDP报文的IP数据报首部协议字段是17。
UDP长度:UDP首部8B + 数据部分长度(不包括伪首部)。
当传输层从 IP 层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP 数据报通过相应的端口上交给应用进程,如图。
如果接收方 UDP 发现收到的报文中的目的端口号不正确 (即不存在对应于端口号的应用进程),那么就丢弃该报文,并由 ICMP 发送"端口不可达"差错报文给发送方。
2、UDP校验
//待详细补充
二、TCP
UDP的报文长度由发送应用进程决定,而TCP的报文长度由接收方给出的窗口值和当前网络拥塞成都决定的。
1、协议特点
1.TCP是面向连接(虚连接) 的传输层协议。打call
2.每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。
3.TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达。可靠有序,不丢不重
4.TCP提供全双工通信。
发送缓存 准备发送的数据&已发送但尚未收到确认的数据
接收缓存 按序到达但尚未被接受应用程序读取的数据&不按序到达的数据
5.TCP面向字节流 (流:流入到进程或从进程流出的字节序列。)
TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流
2、TCP报文段
TCP的数据单元称为 报文段,TCP报文段既可以运载数据,也可以建立连接、释放连接、应答。(根据控制字内容来决定)
TCP报文 = 首部 + 数据部分
整个TCP报文段作为IP数据报的数据部分封装在IP数据报中。
其首部前20B是固定的,TCP首部 最短为20B,后面有4N个字节是根据需要增加的选项,长度为4B的整数倍。
即:
TCP头 =固定20B + N*4B选项。
UDP头 =8B
TCP首部格式
1)源端口和目的端口,各站2B。端口是传输层与应用层的服务接口,传输层的复用和分用都需要通过端口来实现。
2)序号 : 占4B,范围 0 ~(2^32 )-1 在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据 的第一个字节的序号。(TCP是面向字节流的)
- 确认号 : 4B 期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已正确收到。
4) 数据偏移(首部长度): TCP报文段的数据起始处距离TCP报文段的起始处有多远,以4B位单位,即1个数值是4B。 由于数据偏移 占4bit,而4个bit位所能表示的最大数字是15,所以首部长度最大为 15*4B =60B
5)保留 6位。
6)6个控制位
紧急位URG: URG=1时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。
确认位ACK :ACK=1时确认号有效,在连接建立后所有传送的报文段都必须把ACK置为1。
推送位PSH:PSH=1时,接收方尽快交付接收应用进程,不再等到缓存填满再向上交付。
复位RST:RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输链接。
同步位SYN:SYN=1时,表明是一个连接请求/连接接受报文。
终止位FIN: FIN=1时,表明此报文段发送方数据已发完,要求释放连接。
7)窗口:占2B 范围0~2^16 -1,它指出现在允许对方发送的数据量,接收方数据缓存空间是有限的,因此窗口值作为接收方让发送方设置其发送窗口的一句。(大哥你慢点)
8)校验和。占2B。校验和字段检验的范围包括首部和数据两部分。在计算校验和时和UDP一样,要在TCP报文段前面加上12B的伪首部(只需要将UDP伪首部协议字段的17 改为 6,UDP长度字段改为TCP长度字段,其他和UDP一样)
- 选项: 长度可变 TCP最初只规定一种选项, 即最大报文段长度(MSS)。MSS 是TCP报文段中的数据字段的最大长度(注意是数据字段)。
10)填充: 为了使得整个首部长度是4B的倍数
3、TCP连接管理
TCP连接的三个过程:
建立连接 ----- 数据传送 ----连接释放
TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器。
TCP的链接:三次握手
假设运行在一台主机(客户)上的一个进程想与另一台主机(服务器)上的一个进程建立一条连接,客户应用进程首先通知客户TCP,他想建立一个与服务器上某个进程之间的连接,客户中的TCP会用以下步骤与服务器中的TCP建立一条TCP连接:
ROUND 1:
客户端发送连接请求报文段,无应用层数据,客户端进入 SYN-SENT状态(同步已发送)
SYN=1,seq=x(随机)
ROUND 2:
服务器端为该TCP连接分配缓存和变量 ,并向客户端返回确认报文段,允许连接,无应用层数据。
TCP服务器进入SYN-RECVD 状态(同步收到)
SYN=1,ACK=1,seg=y(随机),ack=x+1
ROUND 3:
客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据。
TCP客户端进程进入 ESTABLISHED状态(已建立)
SYN=0,ACK=1,seg=x+1,ack=y+1
SYN洪泛攻击发生在OI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。
SYN cookie
TCP的链接释放:四次挥手
参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的"资源"(缓存和变量)将被释放。
ROUND 1:
客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接。
FIN=1,seq=u
ROUND 2:
服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了一一半关闭状态。
服务器进入CLOSS-WAIT 等待关闭状态
ACK=1,seq=v,ack=u+1
ROUND 3:
服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接。(服务器进入LAST-ACK 最后确认状态)
FIN=1,ACK=1,seg=w,ack=u+1
ROUND 4:
客户端回送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命) 后,连接彻底关闭。
ACK=1,seq=u+1,ack=w+1
总结:
1)建立连接 3步
1、SYN =1 seq=x
2、SYN=1,ACK=1 , seq =y, ack =x+1
3、ACK=1, seq=x+1,ack=y+1
- 释放连接
1、FIN=1,seq=u
2、ACK=1,seq=v,ack=u+1
3、FIN=1, ACK=1,seq =w,ack =u+1
4、ACK=1,seq=u+1 ack =w+1
4、TCP可靠传输
网络层提供尽最大努力交付,不可靠传输,想要保证可靠传输,还是得依靠传输层
使用TCP实现可靠传输
所谓可靠:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。
TCP实现可靠传输机制的手段
1、校验 ,
和UDP一样,增加了伪首部
2、序号
TCP把数据视为一个无结构但有序的字节流,序号建立在传送的字节流上,而不是报文段。
TCP 连接传送的数据流中的每个字节都编上一个序号。序号字段的值是指本报文段所发送的数据的第一个字节的序号。如图 5.9 所示,假设A 和图5.9 A的发送缓存区中的数据划分成TCP段之间建立了一条 TCP 连接,A 的发送缓存区中共有 10B,序号从0开始标号,第一个报文包含第 0~2 个字节,则该 TCP 报文段的号是0,第二个报文段的序号是 3。
3、确认
TCP 首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。在图5.9 中如果接收方 B 已收到第一个报文段,此时 B 希望收到的下一个报文段的数据是从第3 个字节开始的,那么B 发送给A 的报文中的确认号字段应为 3。
发送方缓存区会继续存储那些已发送但未收到确认的报文段,以便在需要时重传。TCP 默认使用累积确认,即 TCP 只确认数据流中至第一个丢失字节为止的字节。例如,图5.9 中,接收方B收到了A发送的包含字节0~2及字节6~7的报文段。由于某种原因,B还未收到字节3~5的报文段,此时 B 仍在等待字节 3(和其后面的字节),因此B到A的下一个文段将确认号字段置为3。
4、重传
有两种事件会导致 TCP 对报文段进行重传:超时和冗余 ACK
1)超时
TCP 每发送一个报文段,就对这个报文段设置一次计时器。计时器设置的重传时间到期但未收到确认时,就要重传这一报文段。
由于 TCP 的下层是一个互联网环境, IP数据报所选择的路由变化很大,因而传输层的往时延的方差也很大。为了计算超时计时器的重传时间,TCP 采用一种自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两个时间之差称为报文段的往返时间(Round-TriTime,RTT) 。TCP 保留了 RTT 的一个加权平均往返时间 RTT,它会随新测量 RTT 样本值的化而变化。显然,超时计时器设置的超时重传时间(Retransmission Time-Out,RTO)应略大RTTs,但也不能大太多,否则当报文段丢失时,TCP 不能很快重传,导致数据传输时延大。
2)冗余ACK (冗余确认)
每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。发送方已发送1,2,3,4,5报文段
接收方收到1,返回给1的确认 (确认号为2的第一个字节)
接收方收到3,仍返回给1的确认(确认号为2的第一个字节)
接收方收到4,仍返给1的确认 (确认号为2的第一个字节)
接收方收到5,仍返回给1的确认 (确认号为2的第一个字节)
发送方收到3个对于报文段1的冗余ACK 认为2报文段丢失 ,重传2号报文段 快速重传
5、TCP流量控制
TCP 提供流量控制服务来消除发送方(发送速率太快)使接收方缓区溢出的可能性,因此可以说流量控制是一个速度匹配服务(匹配发送方的发送速率与接收方的读取速率)。.TCP 提供一种基于滑动窗口协议的流量控制机制。
接收窗口 rwnd 与拥塞窗口 cwnd
在通信过程中,接收方根据自已接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口 rwnd ,即调整 TCP 报文段首部中的"窗口"字段值,来限制发送方向网络注入报文的速率。同时,发送方根据其对当前网络拥塞程度的估计而确定的窗口值,这称为拥塞窗口cwnd,其大小与网络的带宽和时延密切相关。
即:
发送窗口 =min[ rwnd, cwnd] (单位字节)
【例】:
后续补充
传输层和数据链路层的流量控制的区别是:
传输层定义端到端用户之间的流量控制,数据链路层定义两个中间的相邻结点的流量控制。
另外,数据链路层的滑动窗口协议的窗口大小不能动时动态变化,传输层的则可以动态变化。
6、TCP拥塞控制
//这个后面补充详解
概念:
与流量控制的区别:
方案:
1、慢开始和拥塞避免
2、快重传和快恢复