1 传输层概述
- 这是只有主机才有的层次
1)传输层的功能
①:传输层提供进程和进程之间的逻辑通信
②:复用和分用
- 复用是指发送方不同的进程,可以使用同一个传输层的协议
- 分用是指获取到报文的时候,可以准确的送到某个进程
2)传输层有两个协议
①TCP(面向连接的传输控制协议):
传输数据之前必须建立连接,数据传送结束后释放连接,不提供广播或者多播服务。由于TCP要提供可靠的面向连接的传输服务。因此不可避免的增加了许多的开销,确认,流量控制,计时器以及连接管理等
特点:
可靠,面向连接,时延大,使用于大文件
②UDP(无连接的用户数据报协议):
传送数据不需要建立连接,收到UDP报文后也不需要给出任何的确认
特点:
不可靠,无连接,时延小,适用于小文件
3)传输层的寻址以及端口:
端口是传输层SAP,标识主机中的应用进程(这个端口是软件端口以及逻辑端口)
端口号只有本地意义,在因特网中不同计算机的相同端口是没有联系的(端口号长度为16bit,能表示65535个不同的端口号)
端口按范围分:
①服务端使用的端口号
服务端使用的端口号也分为熟知端口号以及等级端口号
a:熟知端口号
-
端口号得范围为0~1023
-
给TCP/IP最重要的一些应用程序,让所有用户知道
b: 登记端口号: -
端口范围为1024~49151
-
为没有熟知端口号的应用程序使用的
②客户端使用的端口号:
- 端口号范围为49152~65535
- 仅在客户进程运行时才动态选择的端口号
套接字(socket)=(主机IP地址,端口号):
在网络中采用发送方和接收方的套接字组合来识别端点,套接字唯一标识了网络中的一个主机和它上面的一个进程
2 UDP协议
UDP只在IP数据报服务之上增加了很少的功能,即复用分用和差错检测功能
1)UDP的主要特点:
- UDP是无连接的,减少开销结和发送数据之前的时延
- UDP使用最大努力交付,即不保证可靠交付
- UDP是面向报文的,适合一次性传输少量数据的网络应用
面向报文的,就是对于应用层传输下来的报文,是不会进行认为的切割和拆分的 - UDP无拥塞控制,适合很多实时应用
- UDP首部开销小,8B,TCP20B
D
2)UDP首部格式:
源端口号:
指的是发送主机的哪个源进程的端口号(非必须,非必需的情况下全填0)
目的端口号:
指的是接收主机上的进行接收数据的那个进程的端口号
UDP长度:
UDP用户数据报的整个长度
UDP检验和:
- 检验整个UDP数据报是都出错,错就丢弃
- 分用时,找不到对应的端口号,就丢弃报文,并给发送方发送ICMP“端口不可达”差错报告报文
3)UDP校验:
- 伪首部只有在计算校验和的时候才出现,不向下发送也不向上递交
- 17:封装UDP报文的IP数据报首部协议字段是17
- UDP长度:UDP首部8B+数据部分长度想(不包括伪首部)
UDP校验的过程:
发送端将数据添加检验内容的步骤:
- 填上伪首部
- 全0填充校验和字段
- 全0填充数据部分(UDP数据报要看成许多固定4B长度的字串接起来)
- 伪首部+首部+数据部分采用二进制反码求和
- 把求出的结果填入检验和字段
- 去掉伪首部,发送给接收端
接收端对内容进行检验的步骤:
- 填上伪首部
- 伪首部+首部+数据部分采用二进制反码求和
- 如果结果全为1则无差错,否则丢弃数据报/交给应用层附上出错的警告
3.1 TCP协议特点和TCP报文段
TCP的特点:
- TCP是面向连接(虚连接)的传输层协议
- 每个TCP连接只能有两个端点,每个TCP连接只能是点对点的
- TCP提供可靠交付的服务,无差错,不丢失,不重复,按序到达
- TCP提供全双工通信的(发送方和接收方各自都有发送缓存和接收缓存)
发送缓存中存储的是准备发送的数据以及已经发送但是尚未收到确认的数据
接收缓存中存放的是按序到达但是尚未接受应用程序读取的数据以及不按序到达的数据 - TCP面向字节流的
流:流入到进程或从进程流出的字节序列
TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流
TCP报文段的首部格式:
序号:在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号
确认号:期望收到发送方下一个报文段的第一个数据报的序号,若确认号为N,则证明到序号N-1为止的所有序号都已经正确的收到了
数据偏移(首部长度):TCP报文段的数据起始处距离TCP报文段的起始处有多远,以4B为单位,即一个数值是4B
6个控制位:
①紧急位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,窗口扩大,时间戳,选择确认s
3.2 TCP管理
1)TCP连接的三个阶段:
- 建立连接
- 发送数据
- 释放连接
TCP链接的建立采用的是客户服务器方式,主动发送起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器
2)TCP的连接建立:
假设运行在一台主机(客户)上的进程想与另一台主机(服务器)上的一个进程建立连接,客户应用程序首先会通知客户TCP,他想建立一个与服务器上某个进程之间的连接,客户中的TCP会用以下步骤与服务器中的TCP建立一条TCP连接
第一步:客户端发送连接请求报文段,此时并没有应用层数据
- SYN(同步位)为1 :表示请求连接
- seq=x(随机):序号随机产生
第二步:服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据
- SYN=1
- ACK=1(确认控制位)
- seq=y(随机)
- ack=x+1(当确认控制位为1,那么这个确认字段就是有效的了)
第三步:客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,此时是可以携带数据了
- ACK=1
- SYN=0(将同步位置为0,只有开始建立连接的时候才置为1)
- seq=x+1
- ack=y+1
SYN洪泛攻击:
解决的问题就是设置SYN cookie
TCP的连接释放:
参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的资源(缓存和变量)将被释放
第一步:客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接
- FIN=1(将请求释放位置为1)
- sep=u(随机数)
第二步:服务端会送一个确认报文段,客户到服务器这个方向的连接就释放了–半关闭的状态
- ACK=1
- seq=v(取决于服务器发送的最后一个报文段是哪个,比如说最后一个是v-1,那么此处就是v)
- ack=u+1
第三步:服务器发送完数据,就发出连接释放报文段,主动关闭TCP连接
- FIN=1
- ACK=1
- seq=w(取决于服务器在第二步过后发送的最后一个报文段是哪个,比如说最后一个是w-1,那么此处就是w)
- ack=u+1
第四步:客户端会送一个确认报文段,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭-
- ACK=1
- seq=u+1
- ack=w+1
3.3 TCP可靠传输
可靠:保证接收方进程从缓存区中读出的字节流与发送方发出的字节流是完全一致的
TCP实现可靠传输的机制:
校验:
与UDP校验是一样的,都是添加伪首部,然后通过二进制反码的计算方法,计算是否出现出错
序号:
确认:
- 接收方在合适的时候,就发送一个确认报文段,一般采取的是累计确认的方式
- 如果此时接收方已经接收到了3序号以及之前的报文段,那么此时报文段首部确认号字段就为4
- 如果此时4,5,6丢失了,那么即使收到了7,8报文段,返回的确认报文段也是4
重传:
确认重传不分家,TCP在发送方在规定的时间内没有收到确认就要重传已发送的报文段
TCP采用自适应算法(取决于每个报文段的往返时间的加权),动态改变重传时间RTTs(加权平均往返时间)。主要是解决,如果重传时间过短,那么重传的可能就会很大,如果重传时间过长,就会影响发送的效率的问题。
冗余ACK:每当比期望序号大的失序报文段到达的时候,发送一个冗余ACK,指明下一个期待字节的序号
3.4 TCP流量控制
让发送方慢点,要让接收方来得及接收
实现方法:
-
TCP利用滑动窗口机制实现流量控制
-
在通信的过程中,接收方根据自己接收缓存的大小,动态的调整发送方的发送窗口大小,即接收窗口rwnd(接收方设置确认报文段的窗口字段来将rwnd通知各发送方),发送方的发送窗口去接收窗口rwnd和拥塞窗口cwnd的最小值
TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器
若持续计时器设置的时间到期,就发送一个一个零窗口探测报文段,接收方收到探测报文段,接收方收到探测报文段时给出现在的窗口值
若窗口仍然是0.那么发送方就重新设置持续计时器
- 主要是为了解决,当接收方发送了一个零窗口的通知后,随后接收方清理了自己的缓存,再给发送方发送大于0窗口通知的报文段的时候,此时却发生了丢失的情况,这就会造成,接收方在等待发送方发送数据,而发送方也在等待接收方发送窗口通知的斑纹段。这就形成了死锁的局面
3.5 TCP拥塞控制
出现拥塞的条件:对资源需求的总和>可用资源
- 这里的资源指的,网络中的链路的容量以及带宽
- 如果出现了拥塞控制,那么网络中许多资源就会出现同时供应不足以及网络性能变坏和网络吞吐量所输入负荷增大而下降
拥塞控制的方法:
防止过多的数据注入到网络中
拥塞控制的四种算法:
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
接收窗口与拥塞窗口:
- 接收窗口:接收方根据接收缓存设置的值,并告知发送方,反映接收方的容量
- 拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量
慢开始与拥塞避免:
一个传输轮次:发送了一批报文段并收到它们的确认的时间
- 也指的是一个往返时延RTT
- 还可以表示为开始发送一批拥塞窗口内的报文段到开始发送下一批拥塞窗口内的报文段的时间
每次收到一个报文段的确认,就将拥塞窗口设置为之前的两倍。如果将要设置的拥塞窗口值大于了ssthresh值,就将新的拥塞窗口设置为ssthresh的值。ssthresh刚开始会有一个初始值,随后则是每次遇到网络拥塞时拥塞窗口值的一半
快重传和快恢复:
快重传指的是只要收到重复的ACK确认报文,就执行快重传算法
快恢复指的是遇到网路拥塞或者丢包的现象,就将拥塞窗口设置为新的ssthressh值,而不用设置为1