后端网络协议基础知识笔记2(持续更新中。。。)

TCP/IP协议

1.TCP概述

1.1TCP主要特点

  • TCP是面向连接的运输层协议
  • 每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)。
  • 提供可靠交付的服务
  • 提供全双工通信
  • 面向字节流 流(stream)指的是流入到进程或从进程流出的字节序列。

1.2 TCP 面向流的概念

在这里插入图片描述
应当注意:
TCP 连接是一条虚连接而不是一条真正的物理连接。
TCP 对应用进程一次把多长的报文发送到TCP 的缓存中是不关心的。
TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)。
TCP 可把太长的数据块划分短一些再传送。TCP 也可等待积累有足够多的字节后再构成报文段发送出去。

1.3 TCP的连接

  • TCP 把连接作为最基本的抽象。
  • 每一条 TCP 连接有两个端点。TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口。TCP连接的端点叫做套接字(socket)或插口。
  • 端口号拼接到(contatenated with) IP 地址即构成了套接字。
    ps:套接字(socket)=(IP地址:端口号)
    每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定。
    即:TCP 连接 ::= {socket1, socket2} = {(IP1: port1), (IP2: port2)}

1.4 TCP报文段的首部格式

一个TCP报文段分为首部和数据两部分。
TCP报文段首部的前20个字节是固定的,后面有4N字节是根据需要而增加的选项(N必须是整数)。因此TCP首部的最小长度是20字节。

2.TCP的三次握手

采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度
TCP的连接和建立都是采用客户服务器方式。主动发起连接建立的进程叫做客户(client),而被动等待连接建立的进程叫做服务器(server)。

在这里插入图片描述
SYN:synchronous 同步
ACK:acknowledgement 确认
seq:sequence number顺序号码
ack:acknowledge number确认号码
在这里插入图片描述

3.TCP三次握手的漏洞

若是在第三次握手中,假设一个客户端向服务器端发送了SYN报文后突然死机或掉线,那么服务器发出SYN+ACK应答报文后是无法接收客户端的ACK报文的,所以第三次握手无法完成,但是在这种情况下,服务器端会一直尝试重新发送报文(再次发送SYN+SCK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout(大约30秒-2分钟)。一个客户端死机或掉线没什么大问题,若是有一个恶意的攻击者发送大量伪造原IP地址的攻击报文。发送到服务端,服务器将为了维护一个非常大的半连接队列而消耗非常多的CPU时间和内存。服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常需求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYN Flood攻击(SYN 洪水攻击)。
解决方法:

  • 缩短SYN Timeout时间:
    SYN Flood攻击的效果取决于服务器上保持的SYN半连接数,这个值=SYN攻击的频度 x SYN Timeout,所以可以通过缩短从接收到SYN报文到确定这个报文无效并丢弃该连接的时间以达到成倍降低服务器负荷的目的。例如设置为20秒以下(过低的SYN Timeout设置可能会影响客户的正常访问)。
  • 设置SYN Cookie:
    给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击。以后从这个IP地址来的包会被丢弃。
    上述的两种方法只能对付比较原始的SYN Flood攻击,缩短SYN Timeout时间仅在对方攻击频度不高的情况下生效,SYN Cookie更依赖于对方使用真实的IP地址,如果攻击者以数万/秒的速度发送SYN报文,同时利用随机改写IP报文中的源地址,以上的方法将毫无用武之地。例如SOCK_RAW 返回的套接字通过适当的设置可以自己完全控制IP头的内容从而实现IP欺骗。
  • Syn Cache技术
    这种技术在收到SYN时不急着去分配系统资源,而是先回应一个ACK报文,并在一个专用的HASH表中(Cache)中保存这种半开连接,直到收到正确的ACK报文再去分配系统。
  • 使用硬件防火墙
    SYN Flood攻击很容易就能被防火墙拦截。

4.TCP的四次挥手

四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
在这里插入图片描述

  • 数据传输结束后,通信的双方都可释放连接。现在 A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP连接。A 把连接释放报文段首部的 FIN = 1,其序号seq = u,等待 B 的确认。TCP规定,FIN报文即使不携带数据,也消耗一个序号。
  • B 发出确认,确认号 ack = u + 1, 而这个报文段自己的序号 seq = v。TCP 服务器进程通知高层应用进程。从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态。B 若发送数据,A 仍要接收。
  • 若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接。
  • A 收到连接释放报文段后,必须发出确认
  • 在确认报文段中 ACK = 1,确认号 ack =w +1,自己的序号 seq = u + 1。

5.TCP/IP中的数据包

在这里插入图片描述

  • 源端口和目的端口字段——各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。
  • 序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。整个要传送的字节流的起始序号必须在连接建立时设置。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
  • 确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。 若确认号=N,则表明:到序号N-1为止的所有数据都已正确接收。
  • 数据偏移(即首部长度)——占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。“数据偏移”的单位是 32 位字(以 4 字节为计算单位)。
  • 保留字段——占 6 位,保留为今后使用,但目前应置为 0
  • 紧急 URG —— 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
  • 确认 ACK —— 只有当 ACK = 1 时确认号字段才有效。当 ACK  0 时,确认号无效。
  • 推送 PSH (PuSH) —— 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
  • 复位 RST (ReSeT) —— 当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
  • 同步 SYN —— 同步 SYN = 1 表示这是一个连接请求或连接接受报文。
  • 终止 FIN (FINis) —— 用来释放一个连接。FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
  • 窗口字段 —— 占 2 字节,指的是发送本报文段的一方的接收窗口,单位为字节,作为接收方让发送方设置其发送窗口的依据。
  • 检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
  • 紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
  • 选项字段 —— 长度可变。TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 是每一个TCP报文段中的数据字段的最大长度。MSS (Maximum Segment Size)是 TCP 报文段中的数据字段的最大长度。数据字段加上 TCP 首部才等于整个的 TCP 报文段。
  • 填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍。

6.TCP的可靠性

在TCP中,发送端的数据到达接收端时,接收端会返回一个已收到消息的通知,这个消息成为确认应答(ACK)。
如果发送端有收到这个消息,则表明数据已经成功到达对岸,反之数据包丢失的可能性很大。
在一定时间内接收端没有收到接收成功的消息,就默认数据丢失,就会再一次发送数据,由此可见,即使中途数据包丢失,也会再次发起数据传输,保证数据能够达到接收端。
但是这里面也有一些特殊情况:

  • 发送端未收到确认消息,可能是接收端发出的确认消息没达到发送端,在发送的途中丢失了。
  • 还有就是延时,如果确认消息在发送端重新发送数据后才到达也是常见的。
    对于接收端而言,反复收到相同的数据包不是可取的,所以引进了序列号。
    序列号是按照顺序给发送数据的每一个字节(8位字节)都标上了编号。接收端查询数据TCP首部中的序列号和数据的长度,将自己下一步应该接收到的序列号作为确认应答折返回去。通过确认序列号和确认应答号,TCP能够识别自己是否已经接收数据,又能够判断是否需要接收,从而实现可靠传输。
    在这里插入图片描述
    发送缓存:
    在这里插入图片描述
    接收缓存:
    在这里插入图片描述

发送缓存用来暂时存放:

  • 发送应用程序传送给发送方 TCP 准备发送的数据;
  • TCP 已发送出但尚未收到确认的数据。

接收缓存用来暂时存放:

  • 按序到达的、但尚未被接收应用程序读取的数据;
  • 不按序到达的数据。

大佬链接:https://blog.csdn.net/xuzhangze/article/details/80490362

7.TCP的流量控制

利用滑动窗口实现流量控制
在这里插入图片描述
参考链接:
https://www.cnblogs.com/HuiH/p/12599048.html
https://www.cnblogs.com/shizheyangde/p/7434597.html
https://blog.csdn.net/xuzhangze/article/details/80490362

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值