Linux————TCP/IP协议

来源:互联网 发布:联通网络信号怎么样 编辑:程序博客网 时间:2024/05/01 16:52

TCP协议(两台机器间建立连接传递数据)  下面的是底层具体实现

DNS协议(解析域名——ip)

ARP协议(ip——物理地址,机器) IP协议也可以实现

————————————————TCP/IP协议族四层模型和OSI七层模型————————————————


TCP/IP协议族四层模型应用层传输层网络层链路层OSI七层模型应用层表示层会话层传输层网络层数据链路层物理层

其中各层根据协议进行设置,层与层之间通过接口连接。


————————————————xxxxxx————————————————

下图是四层模型中各个层次的作用和特点:


#最底层是数据链路层,比如QQ发送的一句话经过数据链路层进入物理网络。

主要实现了网卡接口的网络驱动程序,用来处理数据在物理媒介上的传输。

常见的物理媒介有以太网和令牌环。

网络驱动程序隐藏了以太网的不同xx特性,为上一级提供统一的接口。交换机就是数据链路层的设备。


#数据链路之上就是网络层,主要实现数据报的转发,处理分组在网络中的活动,通俗的说就是为每一条数据报在网络中选择一条准确快速的道路。各个网络节点的选择!也就推出网络层的通信是逐跳进行。

对上层协议隐藏了网络数据连接的细节,也就是在传输层和应用层来看。通信的两台机器时直接相连的。其中路由器就是工作在网络层。


#网络层之上就是传输层,传输层给两台机器提供端到端的通信。传输层只在乎数据的起始端和结束端,不在乎数据的中转过程。

此图中,垂直实线表示TCPIP协议站中各层之间的实体通信,水平虚线图表示逻辑通信线路。


#协议站的最上层是应用层,主要负责应用层的逻辑,比如文件传输,数据传输


总体来说,他内部的网络驱动程序封装了物理网络的电器细节,网络层又封装了网络连接的细节,传输层给应用程序提供了一个端到端的应用线路,主要进行数据的收发,超支重传等任务。TCP/IP协议站中除应用层都在内核空间中。应用层使用下层提供的服务。最终达到网络通信的目的。



下图是四层模型中相应的协议:


#数据链路层 

ARP协议:地址解析协议。

RARP协议:逆地址解析协议。他们两个协议实现了IP地址和机器物理地址之间的转换。在网络层中使用IP地址来寻机器,到了数据链路层就必须使用机器物理地址来寻机器了。所以先将IP地址转换成物理地址,才能使用链路层的服务,这就是ARP协议的用途。


#网络层

最重要的是IP协议,根据数据报的目的IP地址查看是否能直接发给目标机器,不能则寻找合适的下跳路由器,并把数据报交给这个路由器进行转发,直到交给指定主机,或者发送失败丢弃数据报。

另一个重要协议是ICMP协议:因特网控制报文协议。IP协议的重要补充,主要用于检测网络连接。


#传输层

TCP:传输控制协议。提供 可靠的、面向连接的、基于流 的服务。

可靠性:数据会被准确无误的发送至目标端。

面向连接:使用TCP协议的双方通信前必须先建立TCP连接。并在内核中为该连接维持一些必要的数据结构。连接状态、读写缓冲器、相关定时器。当通信结束时,双方必须关闭这些连接来释放这些内核数据结构。

基于流:数据的传输没有边界,发送端可以逐个字节写入数据,接收端也可以逐个字节读取数据。数据相当于自来水。应用程序接收数据相当于水龙头接水的过程。应用程序中接收缓冲区相当于接水的容器。水龙头连接的水塔是内核缓冲区。内核缓冲区——>>接收缓冲区。

UDP:与TCP相反,不可靠的 无连接的 基于数据报的服务。失败重发什么的要自己设置。无连接导致每次发送数据都要设定接收端地址。数据报导致必须以该数据报长度最小单位一次将数据报数据读出,否则数据被截断。

SCTP:新型协议,为因特网传输电话信号设计。


#应用层:

OSPF协议:开放最短路径优先协议。一种路由器更新协议。主要用于路由器之间的通信,来告知对方路由器的信息。

DNS协议:提供了机器域名到IP地址的转换。

telnet协议:一种远程登录协议。

Ping命令:ping命令 和OSPF协议可以跳过传输层直接使用网络层。


——————————————应用数据在协议站中的存在形式,也就是数据的封装和分用——————————————

#数据的封装形式

#TCP报文段传输过程

#最大传输单元(MTU)

#以太网帧格式

#数据分用的过程



#数据的封装形式



聊天窗口发送的数据就是应用程序数据,从上到下传输,每层传输会加上自己的头信息,也有加上尾部信息的,整个过程就是封装!

经过层层封装,帧才是传输在物理媒介上的数据格式。



#TCP报文段的传输过程


在上面提到:TCP协议为通信的双方维护一个连接,并且在内核中存储相关的数据,这部分TCP头部信息和TCP内核缓冲区一起构成了TCP报文段。当发送端使用send函数向一个TCP连接写入数据时,内核中的TCP模块首先把这些数据复制到与该TCP连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务。在传输层封装的整个TCP报文段就是IP模块的数据。此外:UDP没有必要存数据副本,当发送失败后,如果重新发送就必须重新将数据从用户空间copy到UDP内核发送缓冲区。



#最大传输单元(MTU)

在数据链路层上传输的数据成为帧,帧的最大单元(Max Transmit Unit)称为MTU。也就是帧最多能携带多少上层数据。但是受到上层协议的限制,比如以太网中帧的最大数据时1500字节。而令牌环的最大数据时1492字节。其中超过MTU的部分会被分片!——IP分片



#以太网帧的格式


起始部分由前导码和帧开始符组成。

后面紧跟着目标MAC地址和源MAC地址,因为在链路层数据是靠mac地址寻机器的。

帧的负载部分用来包含其他协议封装后的数据,比如IP数据报。

紧挨负载部分的是一个32(4字节)位冗余校验码,用于校验数据传输是否存在损坏。

此外在一个以太网帧发送出去之后,发送方在下次发送之前还需要一个12字节的空闲发送校验码,也就是尾部的帧间距。

——前面聊天窗的一句话最后经过层层封装通过以太网帧的格式发送至物理网络上。 到这里发送部分讲完,那么是如何被分包的呢,就是下面的数据分用过程!



#数据分用过程


#发送方通过应用层(QQ聊天窗口)发送数据经过传输层(TCP),网络层(IP),链路层(以太网帧在链路层中间传输)封装成以太网帧格式传输到目标机器,首先进入数据链路层,被以太网驱动程序识别,然后沿着协议站自底而上一次传递,各层协议依次处理本层负责的帧中的头部数据来获取所需要的信息,并且将最后处理好的帧交给目标应用程序。这整个过程就是分用。分用过程是依靠头部信息中类型字段实现的。因为IP、ARP、RARP都是通过帧传递数据,所以需要通过帧头来区分他们。前面的以太网帧结构中有两个字节的类型字段。根据这个字段中的数据内容,以太网驱动程序决定交给哪个模块。在网络层也是这样,TCP、ICMP、UDP都是使用IP协议,所以IP数据报的头部才有16位协议字段来区分他们。(关于IP头部字段详细介绍请看其他课程)。数据到了传输层,TCP报文段和UDP数据报通过头部的16位端口号来区分上层应用程序,比如DNS协议对应的端口号为53,HTTP协议对应的端口号为80.就这样帧通过复用后将封装前的原始数据送达到目标服务。


两个问题:以太网帧在复杂的网络环境中如何选路??网络协议又是如何确保数据被准确无误的传输??


————————————————ARP协议工作原理————————————————

数据链路层中ARP协议

#ARP的用途

#ARP请求/应答报文详解

#ARP通信过程


#ARP的用途:能实现任意网络地址到物理地址的转换。就是地址解析协议 还有一个RARP协议 就是逆地址解析协议。它实现了IP地址和机器物理地址之间的转换。

在网络层中使用IP地址寻机器,在数据链路层中使用物理地址寻机器。所以在网络层中必须先将IP地址转换成物理地址,才能使用数据链路层提供的服务。

ARP工作原理:主机向自己所在的网络广播一个ARP请求(该请求包含目标机器的网络地址,同时网络上其他机器都将收到这个请求),只有被请求的机器会回应一个ARP应答,其中包括自己的物理地址。



#ARP请求/应答报文详解


硬件类型:定义物理地址 1表示mac地址

协议类型:表示映射的协议地址类型 0x80表示IP地址

OP:ARP请求 值为1 、ARP应答 值为2、RARP请求 值为3、RARP应答 值为4

后4个字段发送端,目的端以太网地址和IP地址。其中发送端填充除了目的以太网地址以外的3个字段以构成ARP请求报文并发送这个报文。接收端发现目的IP地址是自己就把自己的以太网地址填充进去。然后交换两个发送端地址和两个目的端地址以构成ARP应答并返回。

可以在Ubuntu系统上使用

 ~# arp -a命令查看arp缓存 缓存的是常用的ip地址与物理地址的映射。

~# arp -d 219.245.84.162 删除这条ip地址对应的arp缓存

~# arp -s 219.245.84.162 00:0c:29:6e:63:18 添加这条ip对应的arp缓存

~# igcongi 查看ip

我们可以结合使用ping命令  和tcpdump 查看整个交换流程 记住先删除对应ip的ARP缓存

一个终端中:

~# ping 219.245.84.162

对应的162终端中:

~# tcpdump -i eth0 -ent  '(dst 219.245.84.162 and src 219.245.84.143)or(dst 219.245.84.143 and src 219.245.84.162)'

使用了以上命令后在ping这台机器的过程中可以看到第一条数据内容如下:是请求包

00:0c:29:c2:bd:3d >ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806),length 42: Request who-has 219.245.84.162 tell 219.245.84.143, length 28

全f是以太网的广播地址,用以表示整个局域网

第二条数据如下:是应答包

00:0c:29:6e:63:18 >00:0c:29:c2:bd:3d , ethertype ARP (0x0806),length 60 Reply 219.245.84.162 is-at 00:0c:29:6e:63:18, length 46


————————————————DNS协议工作原理————————————————

#DNS的用途和工作原理

#DNS查询和应答报文详解

#Linux访问DNS服务



#DNS的用途和工作原理

用途:将机器的域名地址转换成IP地址

原理:解析器通过一个或者多个名字服务器来完成相互转换。使用TCP UDP之前必须将主机名转换成IP地址



#DNS查询和应答报文详解

#DNS查询应答报文:



#16位标识字段:用于标记对DNS查询和应答,以此区分一个DNS应答是哪个DNS查询的回应


#16位标志: DNS报文头部标志字段:


QR:查询应答标志——0表示这是一个查询报文   1表示这是一个应答报文

opcode:表示查询和应答的类型——0表示标准查询,1表示反向查询,2表示请求服务器状态

AA:授权应答标志,仅属于应答报文使用——1表示服务器时授权服务器

TC:截断标志,只有当DNS报文使用UDB服务时才使用这个字段,因为UDB有长度限制,所以过长报文会被截断。1表示报文长度超过512字节 出现这种情况就会被截断

RD:递归查询标志——1表示执行递归查询,也就是如果目标DNS服务器无法解析主机名,那么他将使用其他服务器继续查询,直到获得结果并返回给客户端。0表示迭代查询,如果目标DNS服务器无法解析主机名,那么他将自己知道的其他DNS服务器的ip地址返回给客户端。

RA:允许递归标志,仅供应答报文使用——1表示DNS服务器支持递归查询

zero:目前未被使用,必须都设置为0

rcode:4位返回码,表示应答状态——0表示无错误,3表示域名不存在


#后面四个字段 查询报文中问题一般为1 应答,授权,额外资源一般为0.应答报文中应答资源至少为1,授权,额外资源可以为0或者非0


#查询问题具体格式:


查询名:

16位的查询类型:表示如何执行查询操作——1表示获取目标主机的ip地址,5表示获取目标主机的别名,12表示反向查询

16位的查询类:通常为1,表示获取因特网地址,也就是ip地址。


#应答,授权,额外都使用资源记录格式,具体如下:


32位域名:该记录中与资源对应的名字,其格式与查询问题中的查询名字段格式相同

16位类型、16位类字段的含义也与DNS查询问题的对应字段相同

32位生存时间:表示查询结果可被本地客户端程序缓存多长时间,单位为秒

16位资源数据长度、资源数据:内容取决于类型字段


#实例演示Linux下访问DNS的方法

~# host -t A www.baidu.com

www.baidu.com is an alias for www.a.shifen.com.

www.a.shifen.com has address 180.97.33.107

www.a.shifen.com has address 180.97.33.108

从以上信息可以看出 baidu是www.a.shifen.com的别名 并且该机器名对应两个ip地址

host命令使用DNS协议和DNS服务器通信 -t选项告诉服务器使用哪种查询类型 A类型表示通过域名查询ip


在终端1中用tcpdump抓取DNS通信过程中网络上传输的以太网帧

~# tcpdump -i eth0 -nt -s 500 port domain


然后在终端0中使用查询命令

~# host -t A www.baidu.com

输出:

www.baidu.com is an alias for www.a.shifen.com.

www.a.shifen.com has address 180.97.33.107

www.a.shifen.com has address 180.97.33.108


终端1中的输出:
IP 192.168.15.146.37900 > 192.168.15.2.53: 32940+ A? www.baidu.com. (31)
IP 192.168.15.2.53 > 192.168.15.146.37900: 32940 3/4/0 CNAME www.a.shifen.com. , A 180.97.33.107 , A 180.97.33.108 (162)
IP 192.168.15.146.56134 > 192.168.15.2.53: 10796+ A? daisy.ubuntu.com (34)
IP 192.168.15.2.53 > 192.168.15.146.56134: 10796 2/4/4 A 91.189.92.57 , A 91.189.92.55 (216)
^C  ^C是ctrl+c用于退出 
上面
第一个数据包中,数值32940是DNS查询报文的查询标识值,因此该值也出现在DNS应答报文中
+标识启用递归查询标识
第二个数据包中,3/4/0 标识该数据包中包含3个应答资源记录,4个授权资源记录,0个额外信息记录,后面那一串表示3个应答资源记录的内容




0 0
原创粉丝点击