http-tcpip协议

Posted

tags:

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

参考技术A

为了简化网络的复杂度,网络通讯的不同方面被分解为多层次的结构,每一层只与紧挨着的上层或者下层进行交互,将网络分层,这样可以修改,甚至替换每一层的软件,只要层于层之间的接口保持不变,就不会影响到其他层.
网络分层的两种模型
OSI(Open System Interconnection Reference Model):开放系统互联参考模型
TCP/IP 协议族

超文本传输协议(HyperText Transfer Protocol HTTP)
一种无状态的,已请求/应道方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的草文本信息系统灵活互动.
HTTP协议的请求报文和响应报文的结构基本相同,有3部分组成

面向连接的,可靠的,基于字节流的传输层通讯协议
特点
 基于连接的:数据传输之前需要建立连接
 全双工:双向传输(客户端和服务端传输时双向)
 字节流:不限制数据大小,打包成报文段,保证有序接受,重复报文自动丢弃(在实际环境中,会出现tcp在传输中并不只会一条线路,可能有多条线路传输数据,本地是有序的发送,传输过程中运营商会分派很多线路,传输的数据被切割成多个片段,由不同的tcp连接传输,可能导致接收端有乱序 重复的数据产生,tcp接收端会重新排序和去重)
 流量缓冲,:解决双发处理能力的不匹配(发送端能力强接收端能力弱,就需要流量缓冲,将消息放到队列里一点点处理)
 可靠性传输:保证可达,丢包时通过重试机制实现可靠性(如果网络抖动造成的重试,tcp接收端去重,每次发送完数据会接受到接收端传来的反馈,如果没有则重复发送)
 拥塞控制:防止防落出现恶行的拥塞
 TCP的3次握手
 Tcp的报文

1)源端口:sourceport 源端口和IP地址的作用是标识报文的返回地址。端口是一般是客户端随机生成
2)目的端口:destport端口指明接收方计算机上的应用程序接口。服务端端口比如80 8080
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。

(sequence number/acknowledement number)是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。e.g.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。Tcp每一次传输是块的并不是一次全部传送,序号来排序,序号和确认号保证传输的可靠性.

4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值

1)URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。
2)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。SYN=1和ACK=1是服务端返回应答报文,三次握手的第二部.
3)PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
5)SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。当SYN=1和ACK=0就是客户端发送报文用来建立连接.
6)FIN:
finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。四次挥手中用来确认即将断开连接的标识符.

滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。

奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。

只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。

最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。

TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

以太网协议ARP协议NAT协议DNS协议


1. 数据链路层的以太网协议

数据链路层的以太网协议本质上其实就是相邻设备之间的数据转发

以太网协议格式:

在这里插入图片描述

MAC地址:每一个网卡设备在出厂的时候都会拥有一个全球独一无二的MAC地址,MAC地址也被称为硬件的地址。

本质上是:6字节的整数,即uint8_t addr[6]。
可以在ifconfig(LINUX)中查看到对应的MAC地址。
在这里插入图片描述
Windows中可以使用ipconfig -all进行查看
在这里插入图片描述

以太网格式中的类型(2位):

表示的是上层使用了什么协议 (ip / ARP协议)。

有效载荷:[46 ~ 1500]字节

如果网络层递交给数据链路层的数据不够46字节,则会对数据进行相应补0的操作。1500字节刚好是MTU(最大传输单元)的上限。

CRC

校验帧尾,检验数据在传输过程中是否失真。

2. ARP协议

上面其实我们也谈到了以太网协议格式,我们可以看到格式中的目的地址和源地址指的是目的MAC地址和源MAC地址,换句话说,数据在数据链路层进行发生的时候,需要知道目标主机MAC地址,但是网络层的协议递交给数据链路层的数据仅仅包含目标主机的ip地址,我们无法获知其对应的MAC地址,那么,我们该如何获取目标主机的MAC地址呢?

换句话说:

  • 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址。
  • 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。
  • 因此在通讯前必须获得目的主机的硬件地址。

ARP协议就是用来解决此类问题的,他可以通过ip地址获取对应的MAC地址

注意:这里的ip地址本质上是通过路由项计算出来的接下来该条数据该去往的ip地址,而不是自己本身该去的ip地址。

因此,可以说ARP协议是介于网络层和数据链路层之间的协议,话句话来说就是ARP协议建立了主机 IP地址 和 MAC地址 的映射关系

ARP数据报格式

在这里插入图片描述

首先我们来看一下以太网首部的格式

  • 以太网目的地址:在ARP请求中,目的MAC地址填充为:0xFFFFFFFF,表示当前这条数据给子网当中的每一条机器都进行转发。
  • 以太网源地址:就是源MAC地址,就是当前主机的MAC地址。
  • 帧类型:上级协议(ARP协议)

28字节ARP请求/应答

  • 硬件类型:当前的网络类型:以太网、令牌环网。
  • 协议类型:要转换的地址类型,ip转换为MAC。
  • 硬件地址长度:表示MAC地址长度。
  • 协议地址长度:表示ip地址长度。
  • op:标识是请求还是应答

1:请求
2:应答

那么ARP又是如何知道MAC地址的呢?简单地说,ARP是借助ARP请求与ARP响应两种类型的包确定MAC地址的。

假定主机A向同一链路上的主机B发送IP包,主机A的IP地址为172.20.1.1,主机B的IP地址为172.20.1.2,它们互不知道对方的MAC地址。

在这里插入图片描述

主机A为了获得主机B的MAC地址,起初要通过广播发送一个ARP请求包。这个包中包含了想要了解其MAC地址的主机IP地址。也就是说,ARP请求包中已经包含了主机B的IP地址172.20.1.2由于广播的包可以被同一个链路上所有的主机或路由器接收,因此ARP的请求包也就会被这同一个链路上所有的主机和路由器进行解析。如果ARP请求包中的目标IP地址与自己的IP地址一致,那么这个节点就将自己的MAC地址塞入ARP响应包返回给主机A

总之,从一个IP地址发送ARP请求包以了解其MAC地址(ARP请求包还有一个作用,那就是将自己的MAC地址告诉给对方),目标地址将自己的MAC地址填入其中的ARP响应包返回到IP地址。由此,可以通过ARP从IP地址获得MAC地址,实现链路内的IP通信。

根据ARP可以动态地进行地址解析,因此,在TCP/IP的网络构造和网络通信中无需事先知道MAC地址究竟是什么,只要有IP地址即可。

ARP缓存表

如果每发送一个IP数据报都要进行一次ARP请求以此确定MAC地址,那将会造成不必要的网络流量,因此,通常的做法是把获取到的MAC地址缓存(是指预见到同样的信息可能会再次使用,从而在内存中开辟一块区域记忆这些信息) 一段时间。即把第一次通过ARP获取到的MAC地址作为IP对MAC的映射关系记忆(记录IP地址与MAC地址对应关系的数据库叫做ARP表) 到一个ARP缓存表中,下一次再向这个IP地址发送数据报时不需再重新发送ARP请求,而是直接使用这个缓存表当中的MAC地址进行数据报的发送。每执行一次ARP,其对应的缓存内容都会被清除。不过在清除之前都可以不需要执行ARP就可以获取想要的MAC地址。这样,在一定程度上也防止了ARP包在网络上被大量广播的可能性。

当然ARP是有老化时间的,老化时间为20min,会进行相应的更新。

arp协议只能在子网内部使用,只能给子网内部的机器进行广播arp请求。换句话说,只能获取子网内部机器的MAC地址

那么问题来了,IP地址和MAC地址缺一不可吗?

① 数据链路上只要知道接收端的MAC地址不就知道数据是准备发送给主机B的吗,那还需要知道它的IP地址吗?
② 只要知道了IP地址,即使不做ARP,只要在数据链路上做一个广播不就能发给主机B了吗?”那么,为什么既需要IP地址又需要MAC地址呢?

主机A想要发送IP数据报给主机B时必须得经过路由器C。即使知道了主机B的MAC地址,由于路由器C会隔断两个网络,还是无法实现直接从主机A发送数据报给主机B。此时,主机A必须得先将数据报发送给路由器C的MAC地址C1。

在这里插入图片描述
如此看来,IP地址和MAC地址两者缺一不可。于是就有将这两个地址相关联的ARP协议(为了避免这两个阶段的通信带来过多的网络流量,ARP具有对IP地址和MAC地址的映射进行缓存的功能。有了这个缓存功能,发送IP包时就不必每次都发送ARP请求,从而防止性能下降)。

3. NAT协议

NAT也叫地址转换协议

他的作用是:

  • 私网对公网请求的时候:将网络数据当中的私网的源ip地址转化成为公网的ip地址。
  • 公网对私网的应答:将网络数据当中的公网的目的ip地址转化成为私网的ip地址。

即:
在这里插入图片描述

  • 静态NAT:NAT协议,将一个私网和一个公网唯一进行映射管理。
  • 动态NAT:NAT管理的不止是一个公网ip,当私网数据到来的时候,选择一个空闲的ip进行映射。

NAT的工作机制:

如上图,以10.0.0.10的主机与163.221.120.9的主机进行通信为例。利用NAT,途中的NAT路由器将发送源地址从10.0.0.10转换为全局的IP地址(202.244.174.37)再发送数据。反之,当包从地址163.221.120.9发过来时,目标地址(202.244.174.37)先被转换成私有IP地址10.0.0.10以后再被转发(在TCP或UDP中,由于IP首部中的IP地址还要用于校验和的计算,因此当IP地址发生变化时,也需要相应地将TCP、UDP的首部进行转换)

总结一下就是:不管是静态NAT还是动态NAT,都没有缓解ipv4枯竭的问题,本质上还是一个私网IP一定要对应一个公网ip,才能访问互联网。

NAPT协议(动态NAT重载)

在进行私网ip转化为公网ip的时候,不仅仅将ip地址转换掉了,并且还将传输层的端口也转换掉了。

如图:
在这里插入图片描述
主机163.221.120.9的端口号是80,LAN中有两个客户端10.0.0.10和10.0.0.11同时进行通信,并且这两个客户端的本地端口都是1025。此时,仅仅转换IP地址为某个全局地址202.244.174.37,会令转换后的所有数字完全一致。为此,只要将10.0.0.11的端口号转换为1026就可以解决问题。如图所示,生成一个NAPT路由器的转换表,就可以正确地转换地址跟端口的组合,令客户端A、B能同时与服务器之间进行通信。

这种转换表在NAT路由器上自动生成。例如,在TCP的情况下,建立TCP连接首次握手时的SYN包一经发出,就会生成这个表。而后又随着收到关闭连接时发出FIN包的确认应答从表中被删除(UDP中两端应用进行通信时起止时间不一定保持一致,因此在这种情况下生成转换表相对较难) 。

注:在使用TCP或UDP的通信当中,只有目标地址、源地址、目标端口、源端口以及协议类型(TCP还是UDP)五项内容都一致时才被认为是同一个通信连接。此时所使用的正是NAPT。

在NAPT的场景下,一个公网ip,理论上最大可以转换多少个私网ip?

216 = 65536个,即 0 ~ 65535。

对NAT协议的总结:

  • NAT网关对于私网主机和公网主机而言,是透明的,双方在通信过程中是无感知的。
  • NAT网关会保存转换之后的映射关系,防止应答回来之后再次进行转换。
  • 私网 =》公网:是将网络数据当中的源ip地址修改为公网ip地址。
    公网 =》私网:是将网络数据当中的目的ip地址修改成为私网ip地址。
  • NAPT增加了端口的转换,就可以让一个公网ip服务多个私网主机。缓解了ip地址枯竭的问题
  • 数据只能先从私网到公网,不能从公网到私网。

4. DNS协议

DNS协议本身是应用层的协议,并且在传输层使用的UDP协议。也叫域名解析协议,他的作用就是将域名解析为ip地址。

域名:

一级域名:.com.cn.gov.us
二级域名:baidu.comjd.comtaobao.com
三级域名:baike.baidu.com

域名服务器:

根域名服务器:给其他域名服务器做授权使用
一级域名服务器:管理一级域名
二级域名服务器:管理二级域名
三级域名服务器:管理三级域名

域名解析的流程:

递归法解析:
在这里插入图片描述
迭代法解析:
在这里插入图片描述

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

TCPIP协议栈的心跳丢包重传连接超时机制实例详解

TCPIP协议及配置

Linux中网络管理 osi模型 tcpip协议

winsock winsock2 TCP/IP协议 tcpip.sys 网卡驱动 有啥相互关系?

TCPIP网络协议层对应的RFC文档

从磁盘中安装tcpip协议弹窗被组策略阻止,打开组策略后一大堆内容不知道在哪里设置,有电脑高手知道