本章是整理知识内容,为强化知识长期更新。
网络协议
网络协议是一组确定的规则,这些规则确定如何在同一网络中的不同设备之间传输数据。本质上,它允许连接的设备彼此通信,而不管其内部过程,结构或设计是否有差异。(两个端点都需要了解协议才能进行交流)。
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,表示数据已经发送完成,当通信结束希望断开连接时,通信双方的主机之间就可以相互交换
FIN
位置为 1 的 TCP 段。
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连接建立和连接终止中的各个状态
三次握手建立连接
握手的主要行为 SYN 同步 ACK 确认
同步Sequence序列号,初始化序列号ISN(Inital Sequence Number)
交换TCP通讯参数,比如MSS、窗口比例因子、选择性确认、指定校验算法
防止失效的连接请求访问到服务器端,让服务器误认为要建立连接。
过程
- Client 发送 自身的SYN 到 Server ,并包含初始化序列号
- Server 发送一个 SYN 和 ACK 在同一个报文中 给Client ,
- Client 发送一个 ACK 给 Server
实践过程
- 准备一台linxu Centos 且安装好 tcpdump
yum install tcpdump
tcpdump -i eth0 -w out_3.pcap tcp port 80 -c 3 -S
监听eth0网卡、将内容输出到out_3.pacp 方便 Wireshark 分析 、监听tcp 协议 端口 80 只保留前3个包,用绝对序列号代替相对序列化。在客户端使用 curl命令访问对于服务即可。
- 第一次握手客户端发送自身序列号 2883770579 并且 将 syn 设置为 1
- 第二次握手 将 syn设置为 1 、ack 设置为 1, 并且返回确认报文ack 2883770579 + 1 = 2883770580 。
- 第三次握手 将ACK设置成1 , 确认报文ack 2054592687 + 1 = 2054592689 。
四次挥手关闭连接
TCP是全双工的,且存在半关闭(half-close)状态的存在,所以终止TCP协议需要4次握手。连接双方都需要关闭连接。
过程
- Clinet 发送自身 FIN M到 Server
- Server 发送一个ACK 切 M + 1 给 Client
- Server 发送 FIN N 到 Client
- Client 发送 ACK N + 1 到 Server
实践过程
tcpdump -i eth0 -w out_3.pcap tcp port 80 -S
- 不知道为什么不是四次,在客户端发送完请求后,不会立刻关闭连接,仍然处于establish状态,短连接会经过fin-wait1 fin wait2 time_wait
MSS分段
客户端与服务器之间的通信是一个数据传输过程。通信的消息将以数据包形式进行传输。TCP 协议在数据进行数据传输时,使用滑动窗口机制来同时发送多个数据包。当数据包丢失时,TCP 协议利用数据重发功能重新发送数据包。因接收端接收数据包的能力不同,TCP 流控制会根据接收端的能力发送适当数量的数据包。
- 数据分片
- 数据在传输的过程中,会经过很多的物理设备,这些设备处理的数据都有一些限制,因此在发送数据都是好不能超过最大的字节数。这个最大的字节数就是(Maximum Segment Size,MSS)。当要发送的数据超过该值的时候,就需要将数据拆分为多个包,依次发送。
TCP流量控制
TCP阻塞控制
TCP的RST
UDP
DNS,SNMP和TFTP都是使用UDP,实际上DNS和SNMP既可以使用TCP也可以使用UDP。相比TCP,UDP提供了效率,TCP在使用过程中有太多的开销,实际上并不是所有的场景都需要TCP可靠的通信机制,比如DNS
- 无连接 不提供复杂的控制机制,利用 IP 提供面向「无连接」的通信服务
- 协议真的非常简洁,头部只有
8
个字节( 64 位)
UDP报文格式
报文字段含义
- Source Prot 源端口 16bit 范围 0 ~ 56625
- Destination Port 目标端口 16bit 范围 0 ~ 56625
- Length 长度 16bit 表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8。
- checksum 校验值 16bit 可以检验数据在传输过程中是否被损坏。
IP
IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGMP的数据都以IP数据格式传输。要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制,这被认为是上层协议:TCP或UDP要做的事情。
- 无连接、非可靠、无确认。
- IP协议提供了一种分层、与硬件无关的寻址系统,它可以在复杂的路由式网络中传输数据服务。
- IP协议可以将多个网络连接起来,在源地址和目的地址之间传输数据,以适应不同网络对数据包的要求。
HTTP/HTTPS
HTTP 就是超文本传输协议,也就是 HyperText Transfer Protocol。HTTP over SSL/TLS 也就是运行在 SSL/TLS 协议上的 HTTP。
HTTP重要里程碑的时间点
- Http0.9 -> 1991
Http1.0 ->1996
- Http 1.1 -> 1999
Http2 -> 2015
HTML 超文本标记语言
HTTP1.1
1995 年,网景的 Netscape Navigator 和微软的 Internet Explorer 开始了著名的“浏览器大战”,都希望在互联网上占据主导地位。
HTTP2
HTTP/2 基于 Google 的 SPDY 协议,注重性能改善。
HTTP3
HTTP/3 基于 Google 的 QUIC 协议,是将来的发展方向。
Proxy
Http Proxy是Http协议中的一个环节,中转站可以转发客户端请求也可以转发服务端应答。
- 匿名代理:完全“隐匿”了被代理的机器,外界看到的只是代理服务器。
- 透明代理:顾名思义,它在传输过程中是“透明开放”的,外界既知道代理,也知道客户端。
- 正向代理:靠近客户端,代表客户端向服务器发送请求。
- 反向代理:靠近服务器端,代表服务器响应客户端的请求。
SSL/TLS
TLS 是SSL 的改良版本
扩展
描述下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信息的(暂时的)。
描述下Servlet Cookie 与Session。
具体来说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 表示资源的位置,期望提提供查找资源的方法。
- 它是可以对互联网上资源位置访问方式对一种简洁表达。通常的表现格式如下。
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 ,资源映射名称。比如
mailto: xxxxx@qq.com
URI
- RFC1630 (1994.6) Uniform Resource Identifier 用于区分资源 , 是 URL 和 URN 的超集,用于取代URL 和 URN概念。
- URI 属于父类,而 URL 属于 URI 的子类。URL 是 URI 的一个子集。URI:统一资源标识 URL:统一资源定位 URN:统一资源名称。
TCP安全问题
SYN攻击
在三次握手过程中,服务端收到SYN-ACK之后,收到客户端的ACK之前TCP连接成为半连接(half-open connect) ,这个时候服务器处于SYN_REVD状态,收到ACK之后服务器才能转入ESTABLISHED状态。
- SYN 攻击指的是,攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认。由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,导致目标系统运行缓慢,严重者会引起网络堵塞甚至系统瘫痪。
SYN检测
- 在Linux/Unix上可以使用系统自带的netstats命令来检测SYN攻击。
SYN攻击防范
设置超时时间与缓存列队。
应用层connect超时时间调整。
操作系统内核限制调整。
- 服务器端SYN_RCV状态
- net.ipv4.tcp_max_syn_backlog: SYN_RCVD状态的最大连接数。
- net.ipv4.tcp_synack_retries: 被动建立时,发SYN/ACK的重试次数。
- 客户端SYN_SENT状态
- net.ipv4.tcp_syn_retries = 6 主动建立连接时,发SYN的重试次数。
- net.ipv4.ip_local_port_range = 32768 60999 建立连接时的本地端口可用范围。
- ACCEPT列队设置