0%

查缺补漏-网络协议

本章是整理知识内容,为强化知识长期更新。

网络协议

网络协议是一组确定的规则,这些规则确定如何在同一网络中的不同设备之间传输数据。本质上,它允许连接的设备彼此通信,而不管其内部过程,结构或设计是否有差异。(两个端点都需要了解协议才能进行交流)。

OSI网络模型

OSI英文全称叫做(Open System Interconnection Model). 中文全称叫做开放式系统互联模型. 也叫做网络7层模型,从下到上依次为,物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。

  • OIS概念模型实际上并没有真正实现过,但是我们需要参考这个分层来理解网络协议一般来说把5-7层叫做上层,1-4层叫做下层。

  • 7-应用层 -> 网络流程应用(表示的是用户界面,例如Telnet,HTTP、FTP、TFTP、SMTP、SNMP、DNS、TELNET、HTTPS、POP3、DHCP)
  • 6-表示层 -> 数据表示 (数据如何呈现,特殊处理->例如加密,比如JPEG、ASCLL、EBCDIC、加密格式等)
  • 5-会话层 -> 主机间的通信(将不同应用程序的数据分开。建立,管理和终止应用之间的会话)
  • 4-传输层 -> 端到端连接(可靠或不可靠的传递,例如TCP,UDP)
  • 3-网络层 -> 地址和最佳路径(提供路由器用于路径的逻辑寻址,比如ICMP IGMP IP(IPV4 IPV6))
  • 2-数据链路层 -> 媒体访问(将位组合成字节,将字节组合成帧,使用MAC地址访问,错误检测-比如HDLC)
  • 1-物理层 -> 二进制传输(在设备之间移动bits。例如V.35)

TCP/IP网络模型

TCP/IP 模型和OSI相比会简单一点,只有四层,分别为数据链路层,网络层,传输层和应用层。

OSI模型与TCP/IP模型

  • 4-应用层 -> 对应于OSI的5-7层
  • 3-传输层 -> 这个是和OSI的第四层想同的
  • 2-网络层 -> 这个是和OSI的第3网络层对应的
  • 1-网络访问层 -> 这个是和OSI的第1-2层所对应的

TCP/IP协议

TCP/IP的前身APPA:NCP协议。

  • TCP:面向连接的、可靠的、拥塞控制、基于字节流的、有状态服务传输层通信协议。
  • UDP:面向无连接、基于数据包、无状态服务
  • IP:根据IP地址穿透网络传输数据。

TCP

TCP的全称是Transmission Control Protocol,在IP协议之上,解决网络通信可依赖的问题。TCP基本上被以上大多数的协议所使用。

  • 面向连接,也就是建立连接。为了客户端与服务端维护的连接,而建立一定的数据结构维护互相交互的状态。通过这种数据结构来保证所谓的面相连接的特性。
  • 可靠性,通过TCP连接传输的数据,无差错、不丢失、不重复、按顺序到达。使用校验、确认和重传机制来保证可靠传输。
  • 阻塞控制,TCP自己决定何时停止和发送数据。
  • 基于字节流,发送的时候是一个流,没头没尾,消息是有序的,会对重复的消息丢弃。
  • 状态服务
端口号

TCP报文中有端口相关信息,穿插下。端口号的范围从0到65535,通过端口号被分为三个不同的类别。

  • 公认端口(Well-Known)0-1023 是经过实践检验的协议,所以称为公认端口。诸如Http使用端口80,https使用443
    • HTTP - 80
    • HTTPS - 443
    • FTP - 20,21
    • SSH - 22
    • Telnet - 23
  • 注册端口(Registered)1024-49151
  • 临时端口(Ephemeral)49152-65535
TCP报文格式

TCP 报文是 TCP 层传输的数据单元,也称为报文段。TCP 报文中每个字段如图所示。

报文字段含义

固定首部长度为20字节,可变部分0~40字节

  • Source Prot 源端口 16bit 范围 0 ~ 56625

  • Destination Port 目标端口 16bit 范围 0 ~ 56625

  • Sequence Number 序列号字段 32bit

    • 它表示本报文段所发送数据的第一个字节的编号。在 TCP 连接中,所传送的字节流的每一个字节都会按顺序编号。当SYN标记不为1时,这是当前数据分段第一个字母的序列号;如果SYN的值是1时,这个字段的值就是初始序列值(ISN),用于对序列号进行同步。这时,第一个字节的序列号比这个字段的值大1,也就是ISN加1。
  • Acknowledgment Number,ACK Number 确认号字段

    • TCP 确认号(Acknowledgment Number,ACK Number):占 32 位。它表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。其值是接收计算机即将接收到的下一个序列号,也就是下一个接收到的字节的序列号加1。
  • Header Length 数据偏移字段

    • TCP 首部长度(Header Length):数据偏移是指数据段中的“数据”部分起始处距离 TCP 数据段起始处的字节偏移量,占 4 位。其实这里的“数据偏移”也是在确定 TCP 数据段头部分的长度,告诉接收端的应用程序,数据从何处开始。
  • Reserved 保留字段 4bit 为 TCP 将来的发展预留空间,目前必须全部为 0。

  • 标志位字段

    SYN 是发起一个连接,ACK 是回复,RST 是重新连接,FIN结束连接

    • CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置 ECE 标志的 TCP 包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。
    • ECE(ECN Echo):用来在 TCP 三次握手时表明一个 TCP 端是具备 ECN 功能的。在数据传输过程中,它也用来表明接收到的 TCP 包的 IP 头部的 ECN 被设置为 11,即网络线路拥堵。
    • URG(Urgent):表示本报文段中发送的数据是否包含紧急数据。URG=1 时表示有紧急数据。当 URG=1 时,后面的紧急指针字段才有效。
    • ACK:表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。
    • PSH(Push):告诉对方收到该报文段后是否立即把数据推送给上层。如果值为 1,表示应当立即把数据提交给上层,而不是缓存起来。
    • RST:表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
    • SYN:在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。
    • FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。
  • Window Size 窗口大小字段 16bit

    • 它表示从 Ack Number 开始还可以接收多少字节的数据量,也表示当前接收端的接收窗口还有多少剩余空间。该字段可以用于 TCP 的流量控制。
  • TCP Checksum TCP 校验字段 16bit

    • 它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。Checksum 是根据伪头 + TCP 头 + TCP 数据三部分进行计算的。
  • Urgent Pointer 紧急指针字段

    • 仅当前面的 URG 控制位为 1 时才有意义。它指出本数据段中为紧急数据的字节数,占 16 位。当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作。即使当前窗口大小为 0,也是可以发送紧急数据的,因为紧急数据无须缓存。
  • Option 可选项字段

    • 长度不定,但长度必须是 32bits 的整数倍。
TCP状态

TCP的状态变迁图更细致的描述了TCP连接建立和连接终止中的各个状态

UDP

DNS,SNMP和TFTP都是使用UDP,实际上DNS和SNMP既可以使用TCP也可以使用UDP。相比TCP,UDP提供了效率,TCP在使用过程中有太多的开销,实际上并不是所有的场景都需要TCP可靠的通信机制,比如DNS

DNS

DNS是Domain Name System域名系统。可以看做是IP地址和名字对应的数据库。DNS拥有一个主机名或具有映射到IP地址的域名的主机名的数据库。当你向获取www.baidu.com对应的ip时候DNS会提供,蕾丝电话薄一样。

IP

扩展

描述下GET与POST的区别。

  • GET和POST是HTTP请求的两种基本方法。
    • GET:特定浏览器和服务器对URL长度有限制,例如 IE对URL长度的限制是2083字节(2K+35)。理论上没有长度限制,其限制取决于操作系 统的支持。所以GET提交时,传输数据就会受到URL长度的限制。
    • POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制。
  • GET和POST本质上没有区别,只是在浏览器上直观体现方式不同。GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
  • GET产生一个TCP数据包;POST产生两个TCP数据包。
    • 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
    • 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
    • 在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点,一般的浏览POST会发送两次,但是Firefox就发送一次。
  • 安全性
    • 在没有加密的情况安全性是一样的,在浏览器调试模式下可以看到所有数据的。

描述下HTTP Cookie。

  • 一个cookie就是存储在用户主机浏览器中的一小段文本文件。Cookies是纯文本形式,它们不包含任何可执行代码。一个Web页面或服务器告之浏览器来将这些信息存储并且基于一系列规则在之后的每个请求中都将该信息返回至服务器。Web服务器之后可以利用这些信息来标识用户。多数需要登录的站点通常会在你的认证信息通过后来设置一个cookie,之后只要这个cookie存在并且合法,就可以自由的浏览这个站点的所有部分。再次,cookie只是包含了数据。在后续的http 请求中,浏览器会将cookie带回给Web Server。同时在浏览器允许脚本执行的情况下,Cookie是可以被JavaScript等脚本设置的。
  • Cookie的类别。
    • Session Cookie这个类型的cookie只在会话期间内有效,即当关闭浏览器的时候,它会被浏览器删除。设置session cookie的办法是:在创建cookie不设置Expires即可。
    • Persistent Cookie持久型cookie顾名思义就是会长期在用户会话中生效。当你设置cookie的属性Max-Age为1个月的话,那么在这个月里每个相关URL的http请求中都会带有这个cookie。所以它可以记录很多用户初始化或自定义化的信息,比如什么时候第一次登录及弱登录态等。
    • Secure cookie安全cookie是在https访问下的cookie形态,以确保cookie在从客户端传递到Server的过程中始终加密的。但是必须是在HTTPS的情况才有效果。
    • HttpOnly 属性,这个数据设置为true后,客户端通过JS是无法获取到cookie信息的(暂时的)。
  • 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。

    • 服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。
  • Session是以cookie为基础的。在一些web开发的书中,往往只是简单的把Session和cookie作为两种并列的http传送信息的方式,session cookies位于服务器端,persistent cookie位于客户端。

  • Cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗考虑到安全应当使用session。
  • Session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。
  • 单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
  • 关闭浏览器不会导致服务端session被删除,服务器为session设置了一个失效时间,当距离客户上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。
  • 关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。

URI与URL的区别

URL
  • RFC1738 (1994.12) Uniform Resource Locator 表示资源的位置,期望提提供查找资源的方法。
  • 它是可以对互联网上资源位置访问方式对一种简洁表达。通常的表现格式如下。
1
2
3
4
5
6
7
8
9
10
scheme://host[:port#]/path/…/[;url-params][?query-string][#anchor]

scheme //有我们很熟悉的http、https、ftp以及著名的ed2k,迅雷的thunder等。
host //HTTP服务器的IP地址或者域名
port# //HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,
例如tomcat的默认端口是8080 http://localhost:8080/
path //访问资源的路径
url-params //所带参数
query-string //发送给http服务器的数据
anchor //锚点定位
URN
  • RFC2141 (1997.5) Uniform Resource Name ,资源映射名称。比如
1
mailto: xxxxx@qq.com
URI
  • RFC1630 (1994.6) Uniform Resource Identifier 用于区分资源 , 是 URL 和 URN 的超集,用于取代URL 和 URN概念。
  • URI 属于父类,而 URL 属于 URI 的子类。URL 是 URI 的一个子集。URI:统一资源标识 URL:统一资源定位 URN:统一资源名称。