互联网协议

ARP协议

ARP协议属于网络层协议。
用途是根据IP地址计算出MAC地址。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的其他主机可以自主发送ARP应答消息,本机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。

IP协议

P协议用于连接多个分组交换网,他提供在具有固定地址长度的主机之间传送数据报,以及根据各个数据包大小的不同,在需要时进行分段和重组大数据报的功能。IP协议仅限于将数据从源端传送到目的端,而不提供可靠的传输服务。在传送出错时,IP协议通过互联网控制消息协议(ICMP, Internet Control Message Protocol)报告。IP协议属于网络层协议。

功能

寻址:IP协议根据数据报头中所包含的目的地址将数据报传输到目的端,传送过程中对道路的选择称为路由
分段:当一些网络只能传送小数据报时,IP协议将数据报分段并在报头里面注明。数据包也可以被标记为“不可分段”,如果一个数据报被如此标记,那么在任何情况下都不准对他进行分段,如果因此到不了目的地,那么数据包就会在中途被丢弃。

报文格式

在这里插入图片描述

  • 版本:记录数据报属于哪个版本的协议,例如可以用此区分出IPv4和IPv6,这个字段可以使得在不同版本间传递数据变得可行。
  • 头部长:标明IP协议报头有多长,其单位是32bit即4个字节,其最小值为5。
  • 总长:是指整个数据报的长度,包括头部和数据部分,单位是 1 个字节,从图上可以看出,规定总长位数为16bit,能存储最大数据为65535个字节的数据报。
  • 协议:指明IP层所封装的上层协议类型,如ICMP -> 1、IGMP -> 2 、TCP -> 6、UDP -> 17、EIGRP -> 88 、OSPF -> 89等
  • 源地址:发送报文段的IP地址
  • 目的地址:接收报文段的IP地址

TCP协议

TCP协议属于传输层协议。

TCP数据格式

在这里插入图片描述
TCP报文由首部和数据两部分组成。首部一般由20-60字节(Byte)构成,长度可变。其中前20B格式固定,后40B为可选。因为,TCP报文还得传给下层网络层,封装成IP包,而一个IP包最大长度为65535,同时IP包首部也包含最少20B,所以一个IP包或TCP包可以包含的数据部分最大长度为65535-20-20=65495B。
在这里插入图片描述

  • Source Port:用来指明发送端发送数据的进程。
  • Destination Port:用来指明接收端接收数据的进程号。
  • Sequence Number:32位,用来标识从发送端向接收端发送的数据字节流位置,它表示在这个报文段中的的第一个数据字节在数据流中的序号;主要用来解决网络包乱序的问题;
  • Acknowledgment Number:32位,确认序列号,大小上次已经接收的Sequence Number +1 。只有当标志位(TCP flags)中的ACK 标志为1时有效。
  • offset:指明TCP首部的大小,4bit,最多能表示15个32bit的的字,取值范围为[5-15]。
  • TCP flags:标志位,包括6个标志比特,可以有多个同时置1。主要是用于操控TCP的状态机,依次为URG,ACK,PSH,RST,SYN,FIN。每个标志位的意思如下:
    • URG:此标志表示TCP包的紧急指针域有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据;

    • ACK:表示确认序列号有效;

    • PSH:这个标志位表示Push操作。所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队;

    • RST:这个标志表示连接复位请求,用于重建一个已经混乱的连接;

    • SYN:表示同步序号,用来建立连接。SYN标志位和ACK标志位搭配使用,当连接请求的时候,SYN=1,ACK=0;连接被响应的时候,SYN=1,ACK=1;该标志仅在三次握手建立TCP连接时有效;

    • FIN:表示数据发送完毕。

  • window:滑动窗口,用来进行流量控制。

连接的建立(三次握手)

在这里插入图片描述

  1. 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
  2. 第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
  3. 第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。完成了三次握手,客户端和服务器端就可以开始传送数据。

连接的断开(四次挥手)

建立连接后,客户端和服务器都处于ESTABLISED状态。这时,主机1发起断开连接的请求,

  1. 第一次挥手:主机1调用close()函数后,发送FIN报文段,主机1进入FIN_WAIT_1状态
  2. 第二次挥手:主机2接收到主机1发送的FIN报文段,发送ACK确认序列号,告诉主机1我收到了,主机2进入CLOSE_WAIT状态,主机1收到确认包后,进入进入FIN_WAIT_2状态。
  3. 第三次挥手:主机2发送FIN报文段,主机2进入LAST_ACK状态。
  4. 第四次挥手:主机1收到主机2发送的FIN报文段,发送ACK报文段,主机1进入TIME_WAIT状态,告诉主机2我收到你的关闭请求了。主机2收到主机1的ACK报文段后关闭连接,进入CLOSE状态。主机1等待2MSL(报文最大生存时间,MSL,Maximum Segment Lifetime)后,关闭连接,进入CLOSE状态。

为什么要三次握手

在谢希仁的《计算机网络》中是这样说的:
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
在书中同时举了一个例子,如下:
“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

为什么要四次挥手

那四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。

  • FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。(主动方)
  • FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你(ACK信息),稍后再关闭连接。(主动方)
  • CLOSE_WAIT:这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。(被动方)
  • LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。(被动方)
  • TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。(主动方)
  • CLOSED: 表示连接中断。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值