csdn_spider/blog/ds19991999/转载-- TCP-IP协议.md

7.3 KiB
Raw Permalink Blame History

转载

TCP/IP协议

TCP/IP协议

TCP/IP协议

TCP/IP不是一个协议而是一个协议族的统称。里面包括IP协议、IMCP协议、TCP协议。

TCP/IP分层

这里有几个需要注意的知识点:

数据链路层的工作特性:

接下来我们了解一下TCP/IP的工作流程

数据链路层从ARP得到数据的传递信息再从IP得到具体的数据信息

IP协议

IP协议头当中最重要的就是TTLIP允许通过的最大网段数量字段八位规定该数据包能穿过几个路由之后才会被抛弃。

IP路由选择

ARP协议工作原理

ICMP协议网络控制文协议

将IP数据包不能传送的错误信息传送给主机

查询报文

  1. ping查询主机是否可达通过计算间隔时间和传送多少个包的数量1. 子网掩码1. 时间戳:获得当前时间 差错报文

不产生的情况:

  1. ICMP差错报文不产生差错报文1. 源地址为零地址、环目地址、广播地址、多播地址

IP路由器选择协议

静态路由选择

先来看路由选择工作流程:

  1. 配置接口以默认方式生成路由表项或者使用route add手动添加表项1. ICMP报文ICMP重定向报文更新表项1. 动态路由选择(只使用在路由之间)

RIP路由信息协议

分布式的基于距离向量(路由器到每一个目的网络的距离记录)的路由选择协议

router承担的工作

  1. 给每一个已知路由器发送RIP请求报文要求给出完整的路由表1. 如果接受请求就将自己的路由表交给请求者如果没有就处理IP请求表项自己部分+跳数/没有的部分+161. 接受回应更新路由表1. 定期更新路由表一般为30s只能说太频繁~

OSPF开放最短路径优先协议

分布式链路状态(和这两个路由器都有接口的网络)协议

  1. 当链路状态发生变化时采用可靠的洪泛法向所有的路由器发送信息相邻的所有路由器的链路状态1. 最终会建立一个全网的拓扑结构图

TCP/IP的三次握手四次分手

首先我们先来了解TCP报文段

三次握手的过程

客户端我们用A表示服务器端用B表示前提A主动打开B被动打开。

  1. 在建立连接之前B先创建TCB传输控制块准备接受客户进程的连接请求处于LISTEN监听状态1. A首先创建TCB然后向B发出连接请求SYN置1同时选择初始序号seq=x进入SYN-SEND同步已发送状态1. B收到连接请求后向A发送确认SYN置1ACK置1同时产生一个确认序号ack=x+1。同时随机选择初始序号seq=y进入SYN-RCVD同步收到状态1. A收到确认连接请求后ACK置1确认号ack=y+1seq=x+1进入到ESTABLISHED已建立连接状态。向B发出确认连接最后B也进入到ESTABLISHED已建立连接状态。 简单来说,就是
  2. 建立连接时客户端发送SYN包SYN=i到服务器并进入到SYN-SEND状态等待服务器确认1. 服务器收到SYN包必须确认客户的SYNack=i+1,同时自己也发送一个SYN包SYN=k,即SYN+ACK包此时服务器进入SYN-RECV状态1. 客户端收到服务器的SYN+ACK包向服务器发送确认报ACKack=k+1,此包发送完毕客户端和服务器进入ESTABLISHED状态完成三次握手 在此穿插一个知识点就是SYN攻击那么什么是SYN攻击发生的条件是什么怎么避免

在三次握手过程中Server发送SYN-ACK之后收到Client的ACK之前的TCP连接称为半连接half-open connect此时Server处于SYN_RCVD状态当收到ACK后Server转入ESTABLISHED状态。SYN攻击就是 Client在短时间内伪造大量不存在的IP地址并向Server不断地发送SYN包Server回复确认包并等待Client的确认由于源地址 是不存在的因此Server需要不断重发直至超时这些伪造的SYN包将产时间占用未连接队列导致正常的SYN请求因为队列满而被丢弃从而引起网 络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击检测SYN攻击的方式非常简单即当Server上有大量半连接状态且源IP地址是随机的则可以断定遭到SYN攻击了使用如下命令可以让之现行 #netstat -nap | grep SYN_RECV

四次分手的过程

客户端我们用A表示服务器端用B表示。由于TCP连接时是全双工的因此每个方向都必须单独进行关闭。这一原则是当一方完成数据发送任务后发送一个FIN来终止这一方向的链接。收到一个FIN只是意味着这一方向上没有数据流动既不会在收到数据但是在这个TCP连接上仍然能够发送数据知道这一方向也发送了FIN首先进行关闭的一方将执行主动关闭而另一方则执行被动关闭。

前提A主动关闭B被动关闭

为什么连接的时候是三次握手,而断开连接的时候需要四次挥手?

这是因为服务端在LISTEN状态下收到建立连接请求的SYN报文后把ACK和SYN放在一个报文里发送给客户端。而关闭连接时当收到对方的FIN 报文时仅仅表示对方不再发送数据了但是还能接收数据己方也未必全部数据都发送给对方了所以己方可以立即close也可以发送一些数据给对方后再 发送FIN报文给对方来表示同意现在关闭连接因此己方ACK和FIN一般都会分开发送。

  1. A发送一个FIN用来关闭A到B的数据传送A进入FIN_WAIT_1状态。1. B收到FIN后发送一个ACK给A确认序号为收到序号+1与SYN相同一个FIN占用一个序号B进入CLOSE_WAIT状态。1. B发送一个FIN用来关闭B到A的数据传送B进入LAST_ACK状态。1. A收到FIN后A进入TIME_WAIT状态接着发送一个ACK给B确认序号为收到序号+1B进入CLOSED状态完成四次挥手。 简单来说就是
  2. 客户端A发送一个FIN用来关闭客户A到服务器B的数据传送报文段4。1. 服务器B收到这个FIN它发回一个ACK确认序号为收到的序号加1报文段5。和SYN一样一个FIN将占用一个序号。1. 服务器B关闭与客户端A的连接发送一个FIN给客户端A报文段6。1. 客户端A发回ACK报文确认并将确认序号设置为收到序号加1报文段7。 A在进入到TIME-WAIT状态后并不会马上释放TCP必须经过时间等待计时器设置的时间2MSL最长报文段寿命A才进入到CLOSED状态。为什么
  3. 为了保证A发送的最后一个ACK报文段能够到达B1. 防止“已失效的连接请求报文段”出现在本连接中

总结

三次握手流程

  1. 客户端发个请求“开门呐我要进来”给服务器1. 服务器发个“进来吧我去给你开门”给客户端1. 客户端有很客气的发个“谢谢,我要进来了”给服务器

四次挥手流程

  1. 客户端发个“时间不早了我要走了”给服务器等服务器起身送他1. 服务器听到了发个“我知道了那我送你出门吧”给客户端等客户端走1. 服务器把门关上后,发个“我关门了”给客户端,然后等客户端走(尼玛~矫情啊1. 客户端发个“我知道了,我走了”,之后自己就走了。