你真的了解客户端请求如何到达服务器端的吗

Linux点滴运维实践 公众号
k8svip
IP是面向无连接的,是无状态协议,IP协议工作在网络层,主要是定义网络地址、区分网段、相同子网内MAC寻址、对不同子网的数据包进行路由,它主要就是在复杂的网络环境中将数据包发给最终的目标地址。

IOS/OSI参考模型与TCP/IP模型对比

路由交换

路由是三层(网络层)网络技术,交换是二层(数据链路层)技术,三层路由技术其实就完成两个很重要的功能,一个是选路,根据路由表、路由策略、选择最佳路径,二就是转发,根据选择的路径转发;交换技术,二层交换机中维护着一张局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的,这张表就是MAC表。

单播与广播

当交换机从某个端口收到一个数据帧以后,首先,读取包头中的源MAC地址,并且记录源MAC地址的机器是连在哪个端口上;其次,再去读取包头中的目的MAC地址,并在地址表中查找相应的端口,如表中有与这目的MAC地址对应的端口,把数据帧直接发送到目的MAC地址对应的端口上,其实这就是单播;再次,如果MAC表中找不到目的MAC相应的端口,则直接把数据帧广播到所有端口上,当目标服务器对源服务器回应时,交换机又可以学习目的MAC地址与交换机哪个端口对应,在下次传送数据时就不再需要对所有端口进行广播了,这也就是广播。

网卡

网卡是工作在数据链路层的网络设备,是局域网中连接计算机和传输介质的接口,不仅能实现与局域网传输介质之间的物理连接、电信号匹配(模拟信号与电流信号转换)、还涉及数据帧的封装、拆封、介质的访问控制、数据的编码与解码以及数据缓存、监控上传下载流量、控制网速等;

IP地址

IP地址有IPv4与IPv6之分,IPv6是为了解决IPv4地址不足而出现的,但目前IPv4还是主流,下面所有说到的IP地址,默认为IPv4,IP地址根据网络号和主机号来分,分为A、B、C三类基本类型及特殊地址D(多播)、E(保留)。

A类:(1.0.0.0-126.0.0.0)(子网掩码:255.0.0.0)第一个字节为网络号,后三个字节为主机号,一般用于大型网络;

B类:(128.0.0.0-191.255.0.0)(子网掩码:255.255.0.0)前两个字节为网络号,后两个字节为主机号,一般用于中等规模网络;

C类:(192.0.0.0-223.255.255.0)(子网掩码:255.255.255.0)前三个字节为网络号,最后一个字节为主机号,一般用于小型网络;

D类:是多播地址,地址的网络号取值于224~239之间,一般用于多路广播用户;

E类:是保留地址,地址的网络号取值于240~255之间,保留地址。

在IP地址3种基本类型里,各保留了3个区域作为私有地址,其地址范围如下:

A类地址:10.0.0.0~10.255.255.255

B类地址:172.16.0.0~172.31.255.255

C类地址:192.168.0.0~192.168.255.255

划分网络时,还应该注意,主机号全0和全1的地址,都无法使用,主机号全0代表指向那个网段、主机号全1代表广播地址,其它地址就是普通的IP地址了,特殊地址:127.0.0.1,也是本机地址,等效于localhost或本机IP。

IP协议

IP是面向无连接的,是无状态协议,IP协议工作在网络层,主要是定义网络地址、区分网段、相同子网内MAC寻址、对不同子网的数据包进行路由,它主要就是在复杂的网络环境中将数据包发给最终的目标地址。

IP协议为什么设计成无状态的?

1. 无状态的协议处理相对简单;

2. 通信之前无需要建立连接;

3. TCP 已经是面向连接服务了,IP层可委托TCP来解决面向连接的问题;

4. 由于不带有状态,互联网路由起来更加自由、容错性也更强;

值得注意的是,现实中的IP层往往都带有安全过滤,甚至有些路由器,防火墙等中途设备还会干涉应用,为了更好的做安全检测,IP层还增加了connection tracking,在无状态协议上面来追踪上层连接,这种方式提高了安全性,但有时也会带来新的问题。

在IP经验知识方面,大致总结以下几点

1. IP 数据包每次选择路径不是固定的,到达的顺序很有可能是乱序的;

2. IP 数据包经过的地方,中途设备不仅仅具备路由功能,而且还会干涉TCP会话,再有防火墙或其它安全过滤设备时,还有可能会出现RST(RST表示复位,用来关闭异常的连接,异常断链);

3. IP 协议是无状态协议,简化互联网架构,是互联网大获成功的关键因素之一;

4. IP层对TCP传递过来的数据包很少分片处理;

DNS协议

DNS域名系统协议,出现的目的是为了解决大家很难记住IP地址(像上面所列的知识点IP知识一样),但大家都需要访问一个网站,所以后来出现了DNS域名服务,主要是用于域名与IP地址的相互映射的一个分布式数据库,从而方便用户浏览网页。

图 DNS递归迭代查询

DNS查询解析又分为两种,一种是递归,还有一种迭代,这里简单说下,递归是用户只向本地DNS服务器发出请求后,就等待肯定或者否定的答案,而迭代是本地名称服务器向根DNS服务器发出请求,而根服务器只是给出下一级DNS服务器的地址,然后本地服务器再向下一级DNS服务器请求,直至得到最终答案。

注意,客户机与本地DNS服务器之间,一般是递归查询,而DNS服务器与下一级DNS服务器之间,一般是迭代查询,域名查询优先查询浏览器缓存,其次是本地/etc/hosts,最后访问本地DNS,如果本地有,或者本地缓存中有,直接返回,如果没有,根据配置进行递归或者迭代查询。

ARP/RARP协议

ARP(Address Resolution Protocol)即地址解析协议,是根据IP地址获取物理MAC地址的一个TCP/IP协议簇中的一员,ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加和删除静态对应关系等;

RARP 即逆地址解析协议,功能和ARP协议相对,其将局域网中某个主机的物理MAC地址转换为IP地址;

互联网中常说的元组根据指的是什么

四元组:源IP、目的IP、源端口、目的端口;

五元组:源IP、目的IP、协议类型、源端口、目的端口;

七元组:源IP、目的IP、协议类型、源端口、目的端口、服务类型、接口索引;

socket 端口

当我们访问一个服务时,或者通过浏览器访问一个网站,需要指明服务器域名(最终都会指向IP)及端口(只是默认http使用80、https使用443),我们没有自己输入而已,但如果访问的端口不是80、443时,就需要人为指定?因为系统服务是通过端口来区分不同应用程序,TCP通过端口找到上层应用,需要注意的是,端口号是有限的,端口号最大为65535,能够利用的端口数量随配置而定。例如在压力测试过程中,一台机器可以利用的TCP端口是有限的,能够利用的连接(客户端端口,客户端IP,服务器应用端口,服务器IP地址)是有限的。为了解决这个问题,可以配置多IP地址来扩大可用连接数量。系统支持同一个端口,不同的IP地址来绑定不同的应用。Linux高版本系统下,在绑定同一个IP地址的情况下,我们还可以利用REUSEPORT机制使不同应用程序共享同一个监听端口,这对高性能服务器开发是非常有用的。

TCP/IP协议概述

TCP和UDP协议是TCP/IP协议的核心,TCP(Transmission Control Protocol)传输控制协议和UDP(User Datagram Protocol)用户数据报协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用,通常是面向连接、端到端和可靠的数据段或数据报发送。通俗来讲,就是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高、数据量大的应用,而UDP对应的则是可靠性要求低、传输经济的应用。

TCP协议特性

TCP是一种面向连接、可靠的、基于字节流的通信协议,TCP的主要工作是定义端口标识应用程序身份,实现端对端的可靠通信,并进行拥塞控制、防止阻塞,哪么TCP有哪些特性,支撑它这种功能呢?

一、面向连接:通信双方传输数据前,需要连接一个连接,即需要三次握手,连接标识即为四元组:源IP、源端口、目的IP、目的端口;

通信双方传输完数据后,还需要四次或三次挥手;

二、双向字节流:本地向远端和远端向本地,都使用字节流的方式进行通信,每个方向都利用单独的序列号对字节流进行标记;

三、有序传输:通过TCP header的sequence序号对不同数据包进行排序;

四、通过ack确认实现可靠性:通过对端的acknowlegment number和本地的缓存,实现重传确保传输可靠性;

五、流量控制:发送的一方根据对方的接收窗口大小进行数据传递,确保对方能够接收下所发送的数据,以免造成拥塞;

六、拥塞控制:不同于流量控制,拥塞控制是由发送者决定的,而拥塞窗口通过限制正在网络中传输的数据大小、防止网络拥塞;

后面会针对TCP中的每一项特性,分章节,详细总结。

TCP 使用经验总结

1. 距离越远,延迟越大,重传概率越大;

2. 网络状况好坏,直接影响应用程序性能;

3. 不同网络环境,会采用不同的拥塞算法;

4. 拥塞控制算法是互联网的精华,是互联网大获成功的关键因素之一;

5. TCP是有状态协议,采用异步处理;

6. 使用tcpdump或wireshark抓包分析是找到TCP相关问题根本原因的利器;

客户端请求是如何到达服务器

这里我们以访问www.k8s.vip页面为例,进行简单总结下当我们在浏览器中输入域名,按回车后,发生了什么。

图 数据包传输

一、用户在浏览器中输入www.k8s.vip 回车;

1. 查询本地浏览器缓存的域名解析记录,如果存在,直接根据解析记录进行路由访问;

2. 如果浏览器缓存记录不存在,会查询本地hosts文件,如果存在,直接根据配置的记录去访问;

3. 最后,如果浏览器缓存不存在,本地hosts也没有,就会向DNS请求解析,得到A记录的IP;

这里的A记录中的IP,就是访问的目的地址,其实这里有可能解析出来多个IP,也会根据一定的算法选择一个进行访问。

二、此时用户通过目的IP、目的端口,源IP(本地IP)、源端口,通过TCP协议去完成三次握手,建议TCP连接;

1. 用户通过 TCP socket 接口发送请求后,TCP协议接管了请求传递,TCP先把请求拆分成一个个更小的数据分段(假设TCP offload没有开启的情况下);

2. 由于网络环境多变,还可能第二个数据包先到达服务器,这时TCP会负责处理TCP Out-Of-Order的情况;如果网络传递过程中,某一个路由器由于过于繁忙,把第一个数据包丢了,那么客户端的TCP会负责重传第一个数据包,确保服务器端的TCP能够不会因为丢包而收不到第一个数据包;

3. 如果用户请求内容很大,如上传一个大文件,就会被拆分成大量数据分段,而TCP传输这些数据分段的时候,往往还会考虑整个互联网能够接收的程度和对方能够接收的程度,发送数据过于贪婪不仅会连累整个互联网,对方也未必能够接收得了,而且还可能使自己速度更慢,这有点像道路驾驶一样,不能过于自私,遵守一定的交通规则才能使道路通畅。在互联网传输数据方面,这些交通规则算法就是赫赫有名的网络拥塞控制算法,而对方能否接收得了,则通过发送窗口的方式进行控制。总体来说,一次发送数据的大小是根据对方的接收窗口大小和拥塞控制算法来综合决定的;

三、通过IP层发送出去,在IP层,这些数据分段会被封装成IP数据包;

1. 通过计算本地IP与目标IP的子网掩码,决定是否为同一局域网;

2. 如果A记录是本地局域网内的IP,通过ARP查询是否有此主机的MAC,如果有,直接复制到数据链路层;

如果没有,就会在此局域网内广播下这个IP,直到得到主机IP对应的MAC,进行转发通信,然后进入数据链路层;

3. 如果A记录与本地IP不在同一局域网,直接转发到网关,由网关再去路由,这些数据包经过互联网的多个路由器到达目的地,由于IP网络是无状态的协议,每一个数据包走的路径可能不一样,而且到达的顺序也有可能不一样,这就要求对端的TCP需要重新组装数据包,以确保向应用层传递的数据是用户能够识别的用户请求,这样服务器应用程序就可以处理用户发起的请求了。

四、通过数据链路层发送到NIC、进行数模转换发送到级连的NIC口,进行交换再路由等;

五、客户端收到客户端response响应后,就会进入关闭环境,进行tcp 四次挥手阶段;

客户机数据包经过一层层的封包,最后通过bit流传输到互联网,互联网中的设备再经过多次路由交换封包解包再转发,最终到达服务器网卡,再解包、重组、得到请求内容,进行处理;处理完成后,进行响应,再把数据根据转发出去。

每次的网络请求可能涉及到的技术点有:缓存、DNS协议、TCP协议(流量控制、拥塞控制、窗口大小等)、IP协议、HTTP协议、ARP协议、ICMP协议、路由协议(ospf、RIP、BGP等)、交换、NAT技术、负载均衡等等;

THEEND

最新评论(评论仅代表用户观点)

更多
暂无评论