TCP/IP协议栈

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP/IP协议栈相关的知识,希望对你有一定的参考价值。

  TCP/IP协议栈全称是传输控制协议/因特网互联协议,其实是OSI模型的进化版,所以就先解释一下什么是OSI模型,OSI的全称是开放系统互连参考模型,就是为了实现开放系统互连所建立的通信功能分层模型,其目的就是为异种计算机互连提供一个共同的基础和标准框架,并为保持相关标准的一致性和兼容性提供共同的参考。这里的开放系统指的是遵循OSI模型和相关协议能够实现互连的具有各种应用目的的计算机系统。OSI模型一共有七层,TCP模型一共只有四层,分别为应用层,传输层,Internet层,网络访问层。它定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。

1.应用层包含的所有的高层协议有FTP,TFTP,NFS,SMTP,Tenlet,rlogin,SNMP,DNSHTTPHTTPS这些都是和用户打交道的协议

2.传输层包含的协议有UDP,TCP,现在通用的网络传输控制协议,使源端口和目的端机器上的对等实体可以进行会话。

3.Internet层的是整个结构体系的关键部分,其功能是使主机可以把分组发往任何网络,并使分组独立的传向目标,这些分组可能经由不同的网络,到达的顺序也可能不同。高层如果想要转发就必须自行处理分组的排序。互联网层使用因特网协议IP,ICMP,OSPF,ELGRP,IGMP,ARP,RARP

ICMP和IGMP以及其他支持IP的协议帮助IP完成特定的任务,如传输差错控制信息以及主机/路由器之间的控制电文等。网络层掌管着网络中主机间的信息传输。

4.网络访问层并没有很详细的定义,就是说主机必须使用某种协议与网络相连SLIP,CSLIP,PPP,MTU,ISO2110IEEE802IEEE802.2

重点1TCP协议  

注意:传输层通过端口来确定应用层的协议。

TCP协议特性:

 工作在传输层面向连接协议

 全双工协议

 半关闭:一边断开就不连接

 错误检查:把没收到的包通知发送方重新发

 将数据打包成段,排序

 确认机制

 数据恢复,重传

 流量控制,滑动窗口

 拥塞控制,慢启动和拥塞避免算法

TCP包头信息

------端口

计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16

----序列号Seq

tcp传输数据的时候会把数据切割成很多小的包,每个包都有自己的序列号2^32-1,如果序列号相同,会有其他的选项来区分不同包。

------确认号Ack

如果a给b发送数据,如果包的编号是100,那么b确认收到的时候会从101回过去确认希望下次收到101的包,,b收到包后在自己这也有一个包的编号可能是10000

-------数据偏移

表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP报文段的数据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32(4个字节为计算单位), 4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节

-------标记位

UGR:紧急数据 1

ACK:确认标记位 1数据有效

PSH:如果是1不会存放在缓存区,没有延迟

RST:如果是1 出错重设

SYN:请求通讯位1

FIN:请求分手位1

-----窗口

双方协商发送数据的速度,也就是数据发送量,窗口大小可能会变化。

-----选项

一些额外的功能,比如当两个包的ip相同的时候可以根据选项来区分两个包。

重点2TCP协议三次握手

TCP三次握手之后就会建立连接,之所以三次是因为避免资源浪费,但是这样也会出现Dos(半连接攻击)拒绝服务,造成服务器宕机,资源耗尽。

一般客户端向服务器发送请求,经历五个状态。

技术分享


解析:首先来说SYN是用来同步的,ACK报文是用来应答的。当客户端向服务器端请求连接的时候一共经历了五种状态,首先客户端在打开自己向客户端发送请求,此时的同步序号SYN=1(因为没有收到任何TCP报文段所以不用确认报文段)表明客户端请求连接,请求连接的报文段的第一个字节的序列号为x,假设同时段的服务器端并没有被其他客户端访问,(服务器端很少有关闭的状态,因为一断开跟一台客户端的连接,立马就转换到监听状态)那么服务器就一直处于监听状态,等待客户端 的访问 ;服务器端收到客户端的请求,同意客户端的连接,此时就发出SYN=1ACK=1,表明同意对方的连接 SYN=1表示服务端收到请求后同意连接,它自己也会发送一个请求连接的请求,ACK=1,表示确认收到服务端的请求连接的报文,所以应答对方建立连接。客户端发送的报文在客户端的报文段的序列号是x,在服务端的报文段的序列号就是可能是y,ack=x+1表示确认收到服务端的请求连接的报文段,希望下次收到的报文段是x+1;双方建立连接,当服务端收到客户端的同意连接请求后,客户端也会回应一下确认收到了服务端的同意请求连接,此时客户端发送的回应报文段就是第x+1,确认收到对方的报文段,希望下次收到的报文段是y+1。三次完成后就建立连接成功,数据就可以正常传送。

重点3TCP协议的四次挥手

技术分享

解析:当服务端接到客户端的FIN的请求分手的报文后,然后客户端立马进入终止等待1的状态意思是说我客户端没有数据要发给你了,但是你如果还有数据没有发送完成,则不必着急关闭接口,可以继续发送数据,你服务端可以先发送一个确认收到我分手的请求,告诉我客户端“我收到你的请求了,但是我还没准备好,请你继续等待我的消息”,此时客户端进入等待2状态,服务端可以继续发送数据,当服务端的数据传送完成后,服务端就发送一个FIN请求分手的报文,告诉客户端我数据发送完毕,也同意你的分手请求,服务端发送的报文段就不是v+1了(因为中间发送了其他的数据包),确认收到并且希望下次发送的包还是u+1(因为中间客户端并没有给服务端发送任何数据),服务端的请求分手的报文段发送完毕后立马进入最后确认阶段,虽然客户端收到报文知道可以关闭连接了,但是还是不相信网络,担心服务端不知道要断开连接,所以客户端发送ACK确认后进入TIME-WAIT时间等待状态,如果服务端没有收到ACK可以重传。服务端收到ACK后就知道断开连接了。客户端2MSL后依然没有收到回复,就证明服务端已经断开连接,那么客户端也就进入关闭阶段断开连接了。此时所有的资源都会被释放,包括端口号,立马切入listen状态。

还有一个closing状态,就是同时发送FIN请求。

问题1:那么为什么连接的时候是三次握手,关闭的时候却是四次挥手?

解析:因为服务端收到客户端的SYN连接的请求后,可以直接发送SYN+ACK报文直接同意连接。SYN是同步连接请求的,ACK是用来应答同步请求的。但是关闭连接的时候,服务端收到报文并不会立即同意关闭连接,所以就会先发送一个ACK,告诉客户端我收到FIN这个报文。只有等我把所有的数据发送完毕后,我才能一起发送FIN=1ACK=1.所以需要四步。

问题2:为什么TIME-WAIT状态需要2MSL才能返回close

TIME-WAIT是为了处理最后一个ACK丢失,如果丢失了可以重传,因为分手经过的时间越长就会风险越大,也就越不可靠,所以可能会出现ACK丢失的情况。

以上说的是传输层的很重要的协议,记住了很重要,很重要,重要的事情说三遍。但是网络层也有几个很重要的协议,下面来细细介绍一下IP,ICMP,ARP,RARP这四个协议。

重点4ICMP网际控制报文协议

其实这个就是为了提高数据报交付成功的机会。报告网络异常和和差错。它是网络层数据报的数据,加上数据报的首部,组成ip数据报发送出去,需要注意的是多播地址的数据报都不发送,还有回环地址和未知地址也不发送。里面有几个比较重要的字段 如下图抓包的数据。

技术分享

其中类型是表示ICMP数据包类型,长度就是八位字段,还有源Mac地址。

重点5APP地址解析协议,其实就是把网络层的IP地址解析成Mac地址。它最初获取对方的Mac地址需要广播,找到Mac地址后的回应并不需要广播,还有就是ARP广播并不是跨路由的,它的缓存区的表会记录Mac地址,存放在缓存中,一段时间断开访问就会被清除掉,下次使用还是会发ARP广播。这样做也是为了节约资源,需要注意的是地址解析协议时建立在网络中各个主机互相信任的基础上的,各个主机可以自主发送ARP应答消息,而且其他主机收到应答报文的时候不会检测报文的真实性就会将记录记入本机的ARP缓存中,由此看来ARP并不安全,可能会有其他的不法主机发送一些错误消息,或者是截获消息使其无法到达预期的主机,这就是ARP欺骗。如下:

技术分享

可以看出当A 主机要访问到B 的时候A 主机会发送广播给同一个网段的其他主机,上图使用路由隔开了AB,所以B 并不能立即接收到A的广播,A首先会给同一网段的路由发送广播,看到底能不能找到B主机,所以源ipA目的ipB(首先肯定会知道对方的ip地址),源Mac地址是A自己的,目标MAC地址就是路由R1邻近自己的那个接口的Mac地址,路由R1也找不到主机B MAC地址,就会通过ARP广播发送给路由R2,路由器R2发送了一个ARP广播发现目标主机在自己这个网段,整个过程ARP就会记录在自己的缓存中。所以其中有风险的就是,当攻击者向目标主机发送伪ARP应答报文,就会篡改本地的Mac地址表,然后导致目标网络与网关通讯失败,而且所有的信息都会通过攻击者的机器,也会存在很大的风险。

当然还有几条关于ARP的命令如下:

arp -n 查找arp记录

Ip neig 查询arp

技术分享

arp -d 删除arp

arp -s ip地址 可以删除一个arp记录

arping  -I eth IP地址 可以查看到冲突的ip地址,并且可以查到对方的MAC地址可以用来测试。

小贴士:反向ARP

现在有很多无盘工作站,比如银行,防止遇到攻击和数据泄露,物理机器从网关服务器的ARP表或者缓存上根据MAC地址请求ip地址的协议,首先查询主机向网路送出一个RARPrequest的广播包,向别的主机查询自己的ip地址。这时候RARP服务器就会将发送端的IP地址用RARPREPLY包回应给查询者,这样查询主机就获得自己的IP地址了。

重点6IP地址

IP地址可唯一标识ip网络中的每台设备。每台主机都必须具有唯一的地址。主要有两部分组成,第一是网络id,标识网络,每个网段分配一个网络id;第二是主机id,标识单个主机,由组织分配给各设备。

例如:172.17.0.100 网段是一样的,但是主机号不一样。可以说IP地址跟人的名字很像,Mac地址就像是身份证号。IP地址主要是给人看的,比较好识别,Mac地址就是计算机识别的,比较不好记。

IP地址分类:

--------公式:

     主机数=2^(主机id位数)-2=2^(32-网络id位数)-2

      网络数=2^可变网络id位数

      网络id值=ip和naetmask相与

      划分子网数=2^网络id向主机id借的位数

      损失id=2*(子网数-1)

--------A类地址:

前八位网络id,24位主机id,最高位为0

表示格式:0xxxxxxx.A.B.C

00000000  未知地址,网络id全为0,当机器刚启动的时候就是0.0.0.0

01111111  127回环地址(广播地址),网络id全为1,虽然可以ping通,但是是自己主机地址,以上两个都不能用,所以要去掉0127这两个值,剩下的就是可以用的

1-126.A.B.C

每个网络的主机数:2^24-2=16777214

255.0.0.0

---------B类地址

B

16位网络id,16位主机id

10xxxxxx.xxxxxxxx.B.C

网络数: 2^14

10000000

10111111

128-191.A.B.C

主机数:2^16-2=65534

255.255.0.0

---------C公有地址

24位网络id,8位主机id

110xxxxx.xxxxxxxx.xxxxxxxx.C

11000000

11011111

每个网络的主机数:2^8-2=254

网络数=2^21=2M

192-223.A.B.C

255.255.255.0

-----D类组播地址

11100000-11101111:224-239

--------E类广播地址240-254

需要知道的是,这些ip地址有很多都是公有ip地址,公有ip都是由互联组织分配,下面这个图就是剩下的私有ip.用于局域网,比较安全,能访问到互联网的别人的用户,但是互联网的用户不能访问到自己家。

 

技术分享

重点7:无类别域间路由(CIDR

在域名系统出现以后的第一个十年里,基于分类网络进行地址分配和路由分配ip数据包的设计就明显显得可扩充性不足,为了解决这个问题,互联网工程小组发布了新的分配IP地址和ipv4数据包的方法。ip数据包包含两个部分:前缀和紧接着的这个网络内的主机地址。在之前的分类网络中IP地址的分配把32位按照每8位为一段分开。这就使得前缀必须是8,16,或者是24位。因此在D类网络中,最小的每个网络段只能分256个地址,这对于很多大企业来说明显是不够的,而B类地址的每个网络的主机ip可以到达65534个,这对于很多小企业来说又会太多了。这就导致了不能充分使用IP地址和加重路由的负担。所以这个时候无类别域间路由就出现了,它最好的地方就体现在可以认为调整网络id的位数。

CIDR表示法:ip/网络id=ip/(32-主机id位数),也就是说当网络id位确定了,主机id自然就知道了。

介绍了这些,那么无类域间路由又是怎么工作的呢?

这个时候就出现了子网掩码,无类域间路由通过子网掩码才能知道哪些位是网络位,哪些又是主机位的id,网络id在主机id的前面,子网掩码一共32位,对应的网络id1,对应的主机id位是0。所以就有以下几种情况。

00000000 0

10000000  128

11000000  192

11100000  224

11110000  240

11111000  248

11111100  252

11111110  254

11111111  255

1:172.17.0.100/26 netmask?每个网络主机数?网络id值?

netmask?

255.255.255.192

主机数:2^(32-26)-2=62

网络id值:172.17.0.01000000

172.17.0.64/26

解析:知道这个ip的网络id的位数26位,前二十六位都是1,所以子网掩码就是255.255.255.192,每个网络的主机数就是减去网络id的位数,然后减去两个不能用的主机id2^32-26-2=62,网络id的值就比较好计算了,前24位不变,还有两位就是占用了最后八位的主机idIP地址和子网掩码相与就是网络id的值了,100的二进制就是01100100,192的二进制就是11000000,结果就是64,所以网络id的值就是172.17.0.64/26.

2:110.110.244.100/22

netmask?

255.255.252.0

主机数?

2^(32-22)-2=1022

网络id值?

110.110.244.0/22

110.110.111101 00.100

255.255.111111 00.0

110.110.11110100.0(110.110.224.0

重点8:划分子网

就是将一个大网络(主机id位多)划分成多个子网(主机id少),那么网络id就像主机id借位,网络id变多,主机id少,这样可以资源更好的利用,也可以降低路由的负担。

但是注意的是每划分一个子网会损失两个边界主机id。例如:10.0.0.0/9划分成两个子网,就会向主机id借一位,最小的id就是10.0 0000000.0.1/9,最大的id就是10.1 1111111.255.254/9,就会损失两个id:10.0 1111111.255.255和10.1 0000000.0.0

3:10.0.0.0/8划分32个子网

每个网络的netmask255.248.0.0

主机数:2^32-13-2=2524286

最小子网的netid 10.00000 000.0.0/13(10.0.0.0/13)

最大的ip范围10.11111 000.0.1-10.11111 111.255.254(10.248.0.1-10.255.255.254)

4:10.0.0.0/8 划分32个子网,第十个子网是河南省,对子网划分64个

        10.01001 000.0.0

        10.01001 000.000 00000.0

        10.72.0.1/13

        255.255.224.0

        主机数:2^(19-13)-2=8190

        最小子网id

        10.01001 000.000 00000.00000001

         10.72.0.1/19

        ip范围:

        10.01001 111.111 00000.00000001

        10.01001 111.111 11111.11111110

        10.79.224.1-10.79.255.254

5:172.200.249.200/22划分16个子网

netmask:255.255.255.192

主机数:2^(32-26(=22+4))-2=62

最小子网的NetID:172.200.248.0/26

最大的ip范围:172.200.111110 11.11 000001-172.200.111110 11.11 111110

小贴士:划分超网:主机id向网络id借位

 例如:220.78.168.0

     220.78.10101 000.0/21(大网络id+新的网络id+主机号)

今天就先分享到这了~~~~~~~~~~

 


以上是关于TCP/IP协议栈的主要内容,如果未能解决你的问题,请参考以下文章

TCP/IP 协议栈

TCP/IP协议栈概述及各层包头分析

几个主流TCP/IP协议栈介绍

做运维需要了解的网络知识,TCP/IP协议栈

浅谈TCP IP协议栈IP协议解析

TCP/IP资料