运输层
运输层协议概述
从通信和信息处理的角度看运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层。
1、运输层的功能
- 运输层为相互应用进程之间提供端到端的逻辑通信(但网络层是为主机之间提供逻辑通信)
- 运输层还要对收到的报文进行差错检测
- 运输层需要有两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP
2、运输层的两个主要协议 - 用户数据报协议 UDP(User Datagram Protocol)
- 传输控制协议 TCP(Transmission Control Protocol)
UDP 在传送数据之前不需要先建立连接。对方的运输层在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 是一种最有效的工作方式。它的优点是简单和快。例如看视频我们追求流畅和快所以即使丢失一两帧图片也不会有影响。
TCP 则提供面向连接的服务。TCP 不提供广播或多播服务。由于 TCP 要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多的开销。这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。例如文本文档和QQ聊天。
3、运输层的端口
端口就是运输层服务访问点TSAP。
TCP/IP的运输层的端口用一个 16 位端口号进行标志。
端口号只具备本地意义,即端口号只是为了标志本计算机应用层中的各进程。
4、客户发起通讯请求时,必须先知道对方服务器的IP地址和端口号,运输层的端口号分为下面三大类:
(1)熟知端口号:数值一般为0~1023.当一种新的应用程序出现时必须为它指派一个熟知端口。
(2)登记端口号:数值为1024~49151,为没有熟知端口号的应用程序使用的。
(3)客户端口号或短暂端口号:数值为49152~65535,留给客户进程选择暂时使用。
5、插口
TCP使用”连接“(而不仅仅是”端口“)作为最基本的抽象。同时将TCP连接的端点称为插口,或套接字,套接口。
用户数据报协议 UDP
(1)UDP 是无连接的,即发送数据之前不需要建立连接。
(2)UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制
(3)UDP 是面向报文的,发送方的UDP对应用程序交下来的报文,在填加首部后就向下交付IP层。
(4)UDP 没有拥塞控制,很适合多媒体通信的要求。
(5)UDP 支持一对一、一对多、多对一和多对多的交互通信(即发不能收,收不能发)
(6)UDP 的首部开销小,只有 8 个字节
传输控制协议 TCP
TCP协议主要特点:
(1)TCP 是面向连接的运输层协议
(2)每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)
(3)TCP 提供可靠交付的服务
(4)TCP 提供全双工通信
(5)面向字节流
TCP的链接
TCP连接的断电叫做套接字或插口
套接字(socket)=(IP地址:端口号)
TCP可靠传输的实现
TCP的可靠性表现在:它向应用层提供的数据是 无差错的、有序的、无丢失的,简单的说就是:TCP最终递交给应用层的数据和发送者发送的数据是一模一样的。
TCP采用了流量控制、拥塞控制、连续ARQ等技术来保证它的可靠性。
停止等待协议(ARQ协议)
1、ARQ(Automatic Repeat reQuest)自动重传请求。
顾名思义,当请求失败时它会自动重传,直到请求被正确接收为止。这种机制保证了每个分组都能被正确接收。停止等待协议是一种ARQ协议。
2、停止等待协议的原理:
- 无差错的情况
A向B每发送一个分组,都要停止发送,等待B的确认应答;A只有收到了B的确认应答后才能发送下一个分组。 - 分组丢失和出现差错的情况
发送者拥有超时计时器。每发送一个分组便会启动超时计时器,等待B的应答。若超时仍未收到应答,则A会重发刚才的分组。 - 应答丢失 和 应答迟到 的情况
TCP会给每个字节都打上序号,用于判断该分组是否已经接收。
3、 停止等待协议的注意点:
每发送完一个分组,该分组必须被保留,直到收到确认应答为止。
必须给每个分组进行编号。以便按序接收,并判断该分组是否已被接收。
必须设置超时计时器。每发送一个分组就要启动计时器,超时就要重发分组。
计时器的超时时间要大于应答的平均返回时间,否则会出现很多不必要的重传,降低传输效率。但超时时间也不能太长。
连续ARQ协议
在ARQ协议发送者每次只能发送一个分组,在应答到来前必须等待。而连续ARQ协议的发送者拥有一个发送窗口,发送者可以在没有得到应答的情况下连续发送窗口中的分组。这样降低了等待时间,提高了传输效率。
在连续ARQ协议中,接收者也有个接收窗口,接收者并不需要每收到一个分组就返回一个应答,可以连续收到分组之后统一返回一个应答。这样能节省流量。
TCP头部的ack字段就是用来累计确认,它表示已经确认的字节序号+1,也表示期望发送者发送的下一个分组的起始字节号。
TCP头部
TCP头部长度有20字节的固定部分,选项部分长度不定,但最多40字节,因此TCP头部在20-60字节之间。
- 源端口 和 目的端口 :传输层和网络层一大重要区别就是传输层指定了数据报发往的应用进程,因此需要端口号标识。
- 序号 :当前TCP数据报数据部分的第一个字节的序号。
- 确认号 :表示当前主机作为接收端时,期望接收的下一个字节的编号是多少。 也表示,当前主机已经正确接收的最后一个字节序号+1。
- 数据偏移(报文长度):它表明了数据报头部的长度。
- 保留字段
- 标识符
TCP有7种标识符,用于表示TCP报文的性质。它们只能为0或1。
(1)URG=1
当URG字段被置1,表示本数据报的数据部分包含紧急信息,此时紧急指针有 效。
(2)ACK=1
ACK被置1后确认号字段才有效。
(3)PSH=1
当接收方收到PSH=1的报文后,会立即将数据交付给应用程序,而不会等到缓冲区满后再提交。
(4)RST=1
当该值为1时,表示当前TCP连接出现严重问题,必须要释放重连。
(5)SYN=1
SYN在建立连接时使用。
当SYN=1,ACK=0时,表示当前报文段是一个连接请求报文。
当SYN=1,ACK=1时,表示当前报文段是一个同意建立连接的应答报文。
(6)FIN=1
FIN=1表示此报文段是一个释放连接的请求报文。
ctf做题
1、bugku上的一个web题:计算器
我们输入会发现只能输入一个数字,这时我们查看源代码然后将这个数字改为3.
然后输入正确答案就得到flag啦!
2、bugku上的一道web题:web基础$_POST
打开网址我们能看到如下代码
$what=$_POST['what'];
echo $what;
if($what=='flag')
echo 'flag{****}';
根据题意我们要访问http://123.206.87.240:8002/get/?what=flag这个网址,然后就能得到flag啦。
3、bugku上的一道web题:矛盾
观察题目
$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}
应该是使用is_numeric遇到%00截断的漏洞,这里构造http://120.24.86.145:8002/get/index1.php?num=1%00得到flag
4、bugku上的一道加密题:简单加密
看到这一串字符,后面有AA猜测是凯撒和base64的混合加密,首先参照ASCII表,A的ASCII是65,=的ASCII是61,偏移了四位,所以写一个python脚本将所有的字符都偏移四位。
def caesar(text):
for i in range(len(text)):
print("{}".format(chr(int(ord(text[i])-4))),end='')
caesar('e6Z9i~]8R~U~QHE{RnY{QXg~QnQ{^XVlRXlp^XI5Q6Q6SKY8jUAA')
得到的base64字串:a2V5ezY4NzQzMDAwNjUwMTczMjMwZTRhNThlZTE1M2M2OGU4fQ==
然后再base64解密就行了。