计算机网络
网络把主机连接起来,而互连网(internet)是把多种不同的网络连接起来,因此互连网是网络的网络。
一、概述#
1. 主机之间的通信方式
-
客户-服务器(C/S):客户是服务的请求方,服务器是服务的提供方。
-
对等(P2P):不区分客户和服务器。
2. 报文交换
- 电路交换:整个报文的比特流连续地从源点直达终点。
- 报文交换:整个报文存储到相邻结点并查找转发表不断跳转。
- 分组交换:单个分组存储到相邻结点并查找转发表不断跳转。
3. 时延
总时延 = 排队时延 + 处理时延 + 发送时延 + 传播时延:
(1)排队时延
分组在路由器的输入队列和输出队列中排队等待的时间,取决于网络当前的通信量。
(2)处理时延
主机或路由器收到分组时进行处理所需要的时间,例如分析首部、从分组中提取数据、进行差错检验或查找适当的路由等。
(3)发送时延
主机或路由器传输数据帧所需要的时间。
(4)传播时延
电磁波在信道中传播所需要花费的时间,电磁波传播的速度接近光速。
4. 体系结构
-
应用层 :以报文为单位为特定应用程序提供数据传输服务,例如 HTTP、DNS 等协议。
-
传输层 :为进程提供通用的数据传输服务。由于应用层协议很多,定义通用的传输层协议就可以支持不断增多的应用层协议。运输层包括两种协议:传输控制协议 TCP,提供面向连接、可靠的数据传输服务,数据单位为报文段;用户数据报协议 UDP,提供无连接、尽最大努力的数据传输服务,数据单位为用户数据报。TCP 主要提供完整性服务,UDP 主要提供及时性服务。
以上为端到端,以下为点到点:
-
网络层 :为主机提供数据传输服务。而传输层协议是为主机中的进程提供数据传输服务。网络层把传输层传递下来的报文段或者用户数据报封装成分组。
-
数据链路层 :网络层针对的还是主机之间的数据传输服务,而主机之间可以有很多链路,链路层协议就是为同一链路的主机提供数据传输服务。数据链路层把网络层传下来的分组封装成帧。
-
物理层 :考虑如何在传输媒体上传输数据比特流,而不是指具体的传输媒体。物理层的作用是尽可能屏蔽传输媒体和通信手段的差异,使数据链路层感觉不到这些差异。
(1)协议
为进行网络中的数据交换而建立的规则、标准或约定称为网络协议。
其中表示层和会话层用途如下:
- 表示层 :数据压缩、加密以及数据描述。
- 会话层 :建立及管理会话。
表示层使得应用程序不必关心在各台主机中数据内部格式不同的问题。五层协议没有表示层和会话层,而是将这些功能留给应用程序开发者处。
(2)TCP/IP
它只有四层,相当于五层协议中数据链路层和物理层合并为网络接口层。
TCP/IP 体系结构不严格遵循 OSI 分层概念,应用层可能会直接使用 IP 层或者网络接口层。
(3)数据在各层之间的传递过程
在向下的过程中,需要添加下层协议所需要的首部或者尾部,而在向上的过程中不断拆开首部和尾部。
路由器只有下面三层协议,因为路由器位于网络核心中,不需要为进程或者应用程序提供服务,因此也就不需要传输层和应用层。
5. 网站访问全过程
(1)事件顺序
- 浏览器解析域名的 IP 地址 ,先寻找本地 hosts 文件;
- 本地 host 没有记录,向 DNS 服务器发送查询报文,解析 IP 地址 ;
- 浏览器与该服务器建立 TCP 连接(默认端口号80);
- 浏览器发出 HTTP 请求,请求网站首页;
- 服务器通过 HTTP 响应把首页文件发送给浏览器;
- TCP 连接释放;
- 浏览器解析 HTML,渲染 CSS。
(2)涉及到的协议
- 应用层:HTTP(WWW 访问协议),DNS(域名解析服务);
- 传输层:TCP(为 HTTP 提供可靠的数据传输),UDP(DNS 使用 UDP 传输);
- 网络层:IP(IP 数据包传输和路由选择),ICMP(提供网络传输中的差错检测),ARP(将本机的默认网关 IP 地址映射成物理 MAC 地址)。
二、链路层#
1. 封装成帧
将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束。
2. 透明传输
透明表示一个实际存在的事物看起来好像不存在一样。
帧使用首部和尾部进行定界,如果帧的数据部分含有和首部尾部相同的内容,那么帧的开始和结束位置就会被错误的判定。需要在数据部分出现首部尾部相同的内容前面插入转义字符。如果数据部分出现转义字符,那么就在转义字符前面再加个转义字符。在接收端进行处理之后可以还原出原始数据。这个过程透明传输的内容是转义字符,用户察觉不到转义字符的存在。
3. 差错检测
目前数据链路层广泛使用了循环冗余检验(CRC)来检查比特差错。
2.1 信道分类#
1. 广播信道
一对多通信,一个节点发送的数据能够被广播信道上所有的节点接收到。
所有的节点都在同一个广播信道上发送数据,因此需要有专门的控制方法进行协调,避免发生冲突(冲突也叫碰撞)。
主要有两种控制方法进行协调,一个是使用信道复用技术,一是使用 CSMA/CD 协议。
2. 点对点信道
一对一通信,不会发生碰撞,因此也比较简单,使用 PPP 协议进行控制。
2.2 CSMA/CD 协议#
CSMA/CD 表示载波监听多点接入/碰撞检测。
- 多点接入 :说明这是总线型网络,许多主机以多点的方式连接到总线上。
- 载波监听 :每个主机都必须不停地监听信道。在发送前,如果监听到信道正在使用,就必须等待。
- 碰撞检测 :在发送中,如果监听到信道已有其它主机正在发送数据,就表示发生了碰撞。虽然每个主机在发送数据之前都已经监听到信道为空闲,但是由于电磁波的传播时延的存在,还是有可能会发生碰撞。
记端到端的传播时延为 τ,最先发送的站点最多经过 2τ 就可以知道是否发生了碰撞,称 2τ 为 争用期 。只有经过争用期之后还没有检测到碰撞,才能肯定这次发送不会发生碰撞。
当发生碰撞时,站点要停止发送,等待一段时间再发送。这个时间采用 截断二进制指数退避算法 来确定。其过程如下:
- 确定基本退避时间,即争用期 2τ;
- 定义参数 k,k 与冲突次数有关, k 不超过16时,k = min(冲突次数,10);
- 从离散的整数集合 [0,1,2,……,(2^k-1)] 中随机的取出一个数 r,等待的时延为 r 倍的基本退避时间,等于 r x 2τ;
- 当冲突次数超过 16 次后,发送失败,丢弃传输的帧,发送错误报告。
2.3 PPP 协议#
互联网用户通常需要连接到某个 ISP 之后才能接入到互联网,PPP 协议是用户计算机和 ISP 进行通信时所使用的数据链路层协议。
2.4 MAC 地址#
MAC 地址是链路层地址,长度为 6 字节(48 位),用于唯一标识网络适配器(网卡),存放在 Ethernet 首部。一台主机拥有多少个网络适配器就有多少个 MAC 地址。例如笔记本电脑普遍存在无线网络适配器和有线网络适配器,因此就有两个 MAC 地址。
三、网络层#
3.1 网际互连协议 IP#
IP 是整个 TCP/IP 协议族的核心,也是构成互联网的基础。IP 地址的编址方式经历了三个历史阶段:
- 分类:{< 网络号 >, < 主机号 >}
- 子网划分:{< 网络号 >, < 子网号 >, < 主机号 >}
- 无分类:{< 网络前缀号 >, < 主机号 >}
3.2 地址解析协议 ARP#
网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变。
每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。
如果主机 A 知道主机 B 的 IP 地址,但是 ARP 高速缓存中没有该 IP 地址到 MAC 地址的映射,此时主机 A 通过广播的方式发送 ARP 请求分组,主机 B 收到该请求后会发送 ARP 响应分组给主机 A 告知其 MAC 地址,随后主机 A 向其高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。
3.3 网际控制报文协议 ICMP#
ICMP(Internet Control Message Protocol) 是为了更有效地转发 IP 数据报和提高交付成功的机会。它封装在 IP 数据报中,但是不属于高层协议。
ICMP 是 TCP/IP 协议族的一个子协议,用于在 IP 主机,路由器之间传递控制消息,控制消息是指网络通不通、主机是否可达、路由器是否可用等网络本身的消息。
3.4 虚拟专用网 VPN#
由于 IP 地址的紧缺,一个机构能申请到的 IP 地址数往往远小于本机构所拥有的主机数。并且一个机构并不需要把所有的主机接入到外部的互联网中,机构内的计算机可以使用仅在本机构有效的 IP 地址(专用地址)。
VPN 使用公用的互联网作为本机构各专用网之间的通信载体。专用指机构内的主机只与本机构内的其它主机通信;虚拟指实际上并不是物理上的专用网,而是经过公用的互联网并加密实现的。
网络地址转换 NAT
专用网内部的主机使用本地 IP 地址又想和互联网上的主机通信时,可以使用 NAT 来将本地 IP 转换为全球 IP。
3.5 路由器#
路由器从功能上可以划分为:路由选择和分组转发。
分组转发结构由三个部分组成:交换结构、一组输入端口和一组输出端口。
路由器分组转发流程
- 从数据报的首部提取目的主机的 IP 地址 D,得到目的网络地址 N。
- 若 N 与此路由器直接相连,则进行直接交付;
- 若路由表中有目的地址为 D 的特定路由,则传送给表中的特定路由器;
- 若路由表中有到达网络 N 的路由,则传送给表中的可达路由器;
- 若路由表中有一个默认路由,则传送给表中的默认路由器;
- 报告转发分组出错。
四、传输层#
UDP 和 TCP 的特点
- 用户数据报协议(User Datagram Protocol,UDP)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。
- 传输控制协议(Transmission Control Protocol,TCP)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。
4.1 TCP 三次握手#
- 首先服务器处于 LISTEN(监听)状态,等待客户的连接请求;
- 客户端向服务器发送连接请求报文,SYN = 1,ACK = 0,选择一个初始的序号 x;
- 服务器收到连接请求报文,如果同意建立连接,则向客户端发送连接确认报文,SYN = 1,ACK = 1,确认号为 x + 1,同时选择一个初始的序号 y;
- 客户端收到服务器的连接确认报文后,还要向服务器发出确认,确认号为 y + 1,序号为 x + 1;
- 服务器收到客户端的确认后,连接建立。
三次握手的原因
第三次握手是为了防止失效的连接请求到达服务器后错误打开重复连接。
客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。
4.2 TCP 四次挥手#
序号和确认号的规则比较简单; ACK 在连接建立之后都为 1。
- 客户端发送连接释放报文,FIN = 1。
- 服务器收到之后发出确认,此时 TCP 属于半关闭状态,服务器能向客户端发送数据但是客户端不能向服务器发送数据。
- 当服务器不再需要连接时,发送连接释放报文,FIN = 1。
- 客户端收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
- 服务器收到客户端的确认后释放连接。
四次挥手的原因
客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。
TIME_WAIT
客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL(Maximum Segment Lifetime,报文最大生存时间)。这么做有两个理由:
- 确保最后一个确认报文能够到达。如果服务器没收到客户端发送来的确认报文,那么就会重新发送连接释放请求报文,客户端等待一段时间就是为了处理这种情况的发生。
- 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。
4.3 TCP 流量 & 拥塞控制#
流量控制和拥塞控制共同决定了发送的速率,发送窗口 = min(拥塞窗口,接收窗口)。
1. 流量控制
点对点通信量的控制,流量控制要做的是抑制发送端发送数据的速率,以便使接收端来得及接收 。
发送窗口(swnd)和接收窗口(rwnd)中所存放的字节数都放在操作系统内存缓冲区中,操作系统缓冲区的调整能影响窗口的大小。TCP 通过让接收方指明希望从发送方接收的数据大小(窗口大小)来进行流量控制。如果窗口大小为 0 时,就会阻止发送方给接收方传递数据,直到窗口变为非 0 为止,这段时间窗口关闭。
窗口关闭是存在潜在风险的:接收方处理完数据后,会向发送方通告一个窗口非 0 的 ACK 报文,如果这个通告窗口的 ACK 报文在网络中丢失,就会导致发送方一直等待接收方的非 0 窗口通知,接收方也一直等待发送方的数据,如不采取措施,就会形成相互等待的死锁。
为了解决死锁问题,TCP 为每个连接设置一个持续定时器,只要 TCP 连接一方收到对方的零窗口通知,就启动持续计时器。如果持续计时器超时,就会发送窗口探测(Window probe)报文,而对方在收到这个探测报文后,给出当时的接收窗口大小:
- 接收窗口不为 0,死锁的局面就被打破了;
- 接收窗口仍然为 0,那么收到这个报文的一方会重新启动持续计时器;
- 接受窗口连续三次为 0,TCP 实现可能会发
RST
报文来中断连接。
2. 拥塞控制
作用于网络,防止过多的数据注入到网络中,避免出现网络负载过大的情况。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。
发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
(1)慢开始
发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 …
(2)拥塞避免
注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。拥塞控制设置一个慢开始门限(slow start threshold,ssthresh),当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。
(3)快重传
当网络出现拥塞,就会发生数据包重传,重传机制有:超时重传和快速重传。
超时重传:重新慢开始(会造成网络卡顿):
ssthresh = cwnd/2
cwnd = 1
快速重传:在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3,之后:
cwnd = cwnd/2
ssthresh = cwnd
- 进入快速恢复算法
(4)快恢复
快速重传和快速恢复算法一般同时使用,在 cwnd = cwnd/2
& ssthresh = cwnd
之后:
- 拥塞窗口
cwnd = ssthresh + n
( 确认有 n 个数据包已接受) - 重传丢失的数据包
- 如果再收到重复的 ACK,那么 cwnd 增加 1
- 如果收到新数据的 ACK 后,设置 cwnd 为 ssthresh,接着就进入了拥塞避免算法
4.4 MTU & MSS#
最大传输单元(Maximum Transmission Unit,MTU):在 TCP/IP 协议族中,指的是 IP 数据报能经过一个物理网络的最大报文长度,其中包括了 IP 首部(从 20 个字节到 60 个字节不等),一般以太网的 MTU 设为 1500 bytes,如果数据大于 1500 bytes,需要分片才能完成发送,这些分片有一个共同点,即 IP Header ID 相同。
最大报文段大小(Maximum Segment Size,MSS):指的是 TCP 提交给 IP 层的最大数据报长度,其中不包括 TCP 首部长度。MSS 由 TCP 链接的过程中由双方协商得出(取较小值),其中 SYN 字段中的选项部分包括了这个信息。如果 MSS + TCP 首部 + IP 首部大于 MTU,那么 IP 报文就会分片,如果小于,那么就可以不需要分片正常发送。
IP 和 TCP 具有分片的能力,而 UDP 没有,比如应用层中的 DNS 协议在发现报文大于 512 字节时会使用 TCP 来传输。
4.5 粘包#
粘包会在在流传输中出现,UDP 不会出现粘包,因为它有消息边界,TCP 粘包有以下两种情况。
- 发送端需要等缓冲区满才发送出去,造成粘包;
- 接收方不及时接收缓冲区的包,造成多个包接收。
通常有以下解决办法:
- 对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP 提供了强制数据立即传送的操作指令 push,TCP 软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;
- 对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;
- 由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。
4.6 RUDP#
视频通话要求传输协议既能保证可靠性,又能保证实时性,这就需要一种同时具备 TCP 和 UDP 优点的协议——RUDP(Reliable UDP),常见的 RUDP 协议有 QUIC,WebRTC,Aeron 等等。可以类比 TCP 采用以下方式增强 UDP 的可靠性:
- 添加 seq/ack 机制,确保数据发送到对端;
- 添加发送和接收缓冲区,主要是用户超时重传;
- 添加超时重传机制。
五、应用层#
5.1 DNS#
域名注册完成后首先需要做域名解析,域名解析就是把域名指向网站所在服务器的IP,让人们通过注册的域名可以访问到网站。IP 地址是网络上标识服务器的数字地址,为了方便记忆,使用域名来代替 IP 地址。域名解析就是域名到 IP 地址的转换过程,域名的解析工作由 DNS 服务器完成。DNS 服务器会把域名解析到一个 IP 地址,然后在此 IP 地址的主机上将一个子目录与域名绑定。域名解析时会添加解析记录,这些记录有:A 记录、AAAA 记录、CNAME 记录、MX 记录、NS 记录、TXT 记录、SRV 记录、URL 转发。
其中 CNAME 将几个主机名指向一个别名,其实跟指向IP地址是一样的,因为这个别名也要做一个A记录的。但是使用CNAME记录可以很方便地变更IP地址。
解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。使用户可就近取得所需内容,解决 Internet 网络拥挤的状况,提高用户访问网站的响应速度和成功率。CDN 能够尽可能的减少资源在转发、传输、链路抖动等情况下顺利保障信息的连贯性。
DNS 解析的过程如下:
- 浏览器缓存:检查浏览器缓存是否有域名对应的 IP 地址;
- 系统缓存:上述失败则检查用户计算机系统 Hosts 文件 DNS 缓存;
- 路由器缓存:上述失败则检查路由器缓存,以上三步均为客服端的 DNS 缓存;
- DNS 缓存:上述失败则检查 ISP DNS 缓存中进行查询。比如电信;
- 根域名服务器:上述失败则进入根服务器进行查询。全球仅有 13 个根域,根域名收到请求后会查看区域文件记录,若无则将其管辖范围内顶级域名(如 .com )服务器 IP 告诉本地 DNS 服务器;
- 顶级域名服务器:上述返回顶级域名服务器地址,发送请求,顶级域名服务器收到请求后查看区域文件记录,若无则将其管辖范围内主域名服务器的 IP 地址告诉本地 DNS 服务器;
- 主域名服务器:上述返回主域名服务器地址,发送请求,主域名服务器接受到请求后查询自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确纪录;
- 保存结果至缓存:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个 IP 地址与 web 服务器建立链接。
5.2 HTTP & HTTPS#
- HTTPS 其实就是建构在 SSL / TLS 之上的 HTTP 协议,HTTPS更耗费服务器资源**。
- HTTP 明文传输,数据未加密,安全性较差,HTTPS 传输中数据加密,安全性较好。
- HTTPS 协议需要到 CA 申请证书。
- HTTP 页面响应速度比 HTTPS 快(HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包; HTTPS 除了 TCP 的三个包,还要加上 SSL 握手需要的 9 个包,共 12 个包)。
- HTTP 默认端口为 80,HTTPS为 443。
传输层安全性协议(Transport Layer Security,TLS)及其前身安全套接层(Secure Sockets Layer,SSL)是一种为互联网通信提供安全及数据完整性保障安全协议。
数字证书认证机构(Certificate Authority,CA)负责发放和管理数字证书。
5.3 socket#
Socket 是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。Socket 起源于 UNIX,在 UNIX 一切皆文件的思想下,进程间通信就被冠名为文件描述符(file descriptor),Socket 是一种打开—读/写—关闭模式的实现,服务器和客户端各自维护一个文件,在建立连接打开后,可以向文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
TCP/IP 只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。就像操作系统会提供标准的编程接口,比如 Win32 编程接口一样,TCP/IP 也必须对外提供编程接口,这就是 Socket。
Socket 跟 TCP/IP 并没有必然的联系。Socket 编程接口在设计的时候,就希望也能适应其他的网络协议。所以,Socket 的出现只是可以更方便的使用 TCP/IP 协议栈而已,其对 TCP/IP 进行了抽象,形成了几个最基本的函数接口。比如 create,listen,accept,connect,read 和 write 等。不同语言都有对应的建立 Socket 服务端和客户端的库。
一个 Socket 由 IP 地址和端口号组成,可以把 Socket 简单理解为 IP 地址加端口号。端口号总是由操作系统分配,它是一个 0~65535 之间的数字,其中,小于 1024 的端口属于特权端口,需要管理员权限,大于 1024 的端口可以由任意用户的应用程序打开。
使用 Socket 进行网络编程时,本质上就是两个进程之间的网络通信。其中一个进程必须充当服务器端,它会主动监听某个指定的端口,另一个进程必须充当客户端,它必须主动连接服务器的IP地址和指定端口,如果连接成功,服务器端和客户端就成功地建立了一个 TCP 连接,双方后续就可以随时发送和接收数据。
因此,当 Socket 连接成功地在服务器端和客户端之间建立后:
- 对服务器端来说,Socket 是指定的IP地址和指定的端口号;
- 对客户端来说,Socket 是所在计算机的 IP 地址和一个由操作系统分配的随机端口号。
端口并不是物理概念,仅仅是协议栈中的两个字节,TCP 和 UDP 传输协议可以同时监听同一个端口,接收数据互不影响。因为数据接收时是根据五元组 {传输协议,源IP,目的IP,源端口,目的端口} 判断接受者的,能够区分同端口而不同协议的情况。
5.4 cookie & session#
session 是一个抽象概念,开发者为了实现中断和继续等操作,将 user agent 和 server 之间一对一的交互,抽象为 “会话”,进而衍生出 “会话状态” [9] 。
cookie 是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是 Session 的一种实现方式。