基础知识
TCP/IP五层模型
作用 | 物理设备 | 协议 | |
---|---|---|---|
应用层 | 负责应用程序沟通 | DNS、DHCP、URL、HTML、HTTP、SSH、TELNET、FTP、SMTP | |
传输层 | 负责两台主机数据传输 | TCP、UDP | |
网络层 | 负责地址管理和路由选择 | 路由器 | IP、ARP |
数据链路层 | 负责设备之间的数据帧的传送和识别 | 交换机 | |
物理层 | 负责光电信号的传递方式 | 集线器 |
网络传输基本流程
1.在局域网中链路层如何通信
一个节点发送数据(带有mac地址),所有节点都能收到,mac地址相同的节点才能接受数据,其余的节点将数据抛弃
2.在局域网中数据如何从A地应用层到达B地应用层
封装、解包分用
3.在广域网中数据如何传输
不断地封装+解包,每经过一个局域网(路由器),IP指导着mac地址变化
相关概念
IP地址:标识网络中不同主机的地址
MAC地址:识别数据链路层中相连的节点
端口号:标识一个进程。一个端口只能属于一个进程,一个进程能有多个端口
IP+port:标识网络上的某一台主机的某一个进程
五元组:源IP+源端口号+目的IP+目的端口号+协议号标识网络上唯一一个端对端的通信通道
端口号范围:1-1023:知名端口号(ssh:22,http:80,https:443,mysql:3306,dns:53);1024-65535:操作系统动态分配的端口号7
物理层
数据链路层
以太网
概念
帧格式
MTU
以太网的最大传输单元(MTU)一般为1500字节
MTU对IP协议的影响
IP分片
MYU对UDP协议的影响
若UDP携带的数据报超过1472,就会在网络层被分为多个IP数据报,若其中一个丢失,会引起接收端重组失败
MTU对TCP协议的影响
TCP建立连接时,通信双方会进行MSS协商。协商过程:双方在发送SYN时在头部写入MSS值,双方选择较小值最为最终MSS
网络层
IP协议
协议头格式
IP地址的基础知识
编址方法
五类地址划分
子网划分
从主机号借用若干位作为子网号,变成三级的IP地址
从一个IP数据报的首部无法判断主机所在的网络是否进行了子网划分,所以需要子网掩码,来找出IP地址中的子网部分
CIDR 无分类域间路由选择
提高了利用率,但IP地址的绝对上限没有增加
网络号 = ip & 子网掩码
主机号 = ip & (~子网掩码)
特殊地址
IP地址的主机地址全为0,就是网络号,代表局域网
IP地址的主机地址全为1,就是广播地址
IP地址的数量限制
IP地址仍然不够用解决方法:
1.动态分配IP地址:只给接入网络的设备分配IP地址
2.NAT
3.IP v6
私有IP地址和公有IP地址
路由
IP的目标就是路由寻路:根据目标IP,找到下一跳的IP
目标的实现靠网络上的每一个节点,每个节点上都有一个路由表
路由表查询:1.目标IP&子网掩码
2.若结果等于目标网络就走这条路,否则发到默认路由
IP协议相关技术
NAT
子网内的主机需要和外网通信,路由器将IP地址逐级替换为公网IP
NAPT
在局域网内,很多主机访问同一个外网服务器,对于服务器返回的数据,NAPT决定返回给哪个主机
ARP(数据链路层/网络层)
每个节点有一个ARP表,根据IP换mac地址
ARP表的来源:在局域网内广播,收到回复后记录到表中,询问时机:发送数据以及定时询问
传输层
socket编程
UDP
UDP服务器
UDP客户端
TCP
TCP服务器
TCP客户端
多线程TCP服务器
TCP客户端
线程池TCP服务器
TCP客户端
TCP vs UDP
TCP | UDP |
---|---|
可靠传输 | 不可靠传输 |
有连接 | 无连接 |
字节流 | 字符流 |
协议介绍
UDP协议
格式
面向数据报
应用层交给UDP多长的报文,就原样发送,不会拆分或合并
缓冲区
UDP没有发送缓冲区,发送成功索命数据到达网络,不代表对方接收到数据
UDP具有接受缓冲区,但不能保证接收顺序与发送顺序一致,同时,若接收区满了,再到达的数据会被丢弃
TCP协议
格式
缓冲区
TCP具有发送缓冲区,因为数据可能需要重传
TCP具有接收缓冲区,因为数据不是马上被应用层取走的,以及收到的数据可能是乱序的
TCP协议栈中,发送成功说明数据被写入TCP协议栈中的发送缓冲区,不代表数据发送到网络上,也不代表对方已收到;对于接收方,若接收缓冲区有数据则直接返回,否则一直阻塞。
TCP实现可靠性的机制
确认应答
SN的作用:1.标号
2.接收方可根据此做排序,保证数据是有序收到的
3.去重
ASN的作用:通知发送方已收到数据,下一个数据从哪发
超时重传
主机A向主机B发送数据,若主机A没有在一个特定的时间间隔内收到主机B的确认应答,就会重发
没有收到B的确认应答可能原因有二:1.因为网络等原因,数据未到达B;2.B发送的确认应答丢失(B会收到重复数据,利用SN去重)
连接管理
三次握手
1.过程描述:标志位+序列号+状态描述+应用层代码
2.为什么是三次
a.为什么不能是两次:若缺少一步就不满足确认应答
b.为什么不能是四次:server回复ACK与SYN可合并
3.建立连接的目的
a.什么是连接
抽象层面:五元组唯一标识的一条通信通道
OS层面:一个Connection对象,描述五元组信息和各种管理信息,OS通过List/Map将对象组织起来
b.为什么要有TCP连接
这套机制是以不同五元组描述的通道管理
c.建立连接的目的
同步ISN(初始序列号)
d.为什么ISN必须是随机的
ISN如果是确定的,可能会被伪造Segment攻击
四次挥手
1.过程描述:标志位+状态描述
2.TIME_WAIT=2MSL
MSL是TCP报文的最大生存时间,在理论上保证最后一个报文可靠到达
3.CLOSE_WAIT
服务器上出现大量的CLOSE_WAIT,原因是服务器没有正确的关闭socket
流量控制
接收主机向发送端主机通知自己可接收数据的大小,发送端发送不超过这个限度的数据,这个大小限度就是窗口大小。(根据对方的接收能力,控制自己的发送量)
当接收端的接收缓冲区面临数据溢出时,就会设置一个更小的窗口大小并通知给发送端,从而控制发送量。
当接收端缓冲区即满,暂停接收数据,若发送端过了超时重传的时间,没有收到接收端窗口更新的通知,就会发送一个窗口探测的数据段,此数据段仅含一个字节以获取接收端最新的窗口大小信息。
拥塞控制
发送方的发送能力 = min(接收方能力,路上的承载能力)
路上的承载能力获取方法:
①连接启动后,确认应答机制 -> 超时重传 -> 评估重传的频率 -> 网络丢包的情况
②连接一启动
TCP提高性能的机制
滑动窗口
快速重传
在窗口比较大,又出现报文丢失的情况下,同一个序列号的确认应答会重复不断地返回,如果发送端连续3次收到同一个确认应答,就会将对应的数据重发
延迟应答
TCP不会一收到数据就马上ACK,等两种情况
①后续可能马上还有数据(两个ACK合并节省网络带宽)
②和捎带应答有关
捎带应答
减少发送的Segment,尽量合并有效数据和ACK应答
粘包问题
站在传输层上,TCP是一个一个报文发过来的,按照SN放在缓冲区中,站在应用层的角度,是一串连续的字节数据
所以需要明确两个包的边界
定长的包,每次按照固定大小读取;
变长的包,可在包头约定一个包总长度的字段,或者在包与包之间使用明确的分隔符
异常情况
进程终止
机器重启
机器掉电/网线断开
应用层
HTTP
协议格式
方法
方法 | 说明 |
---|---|
GET(查询) | 获取资源 |
POST(插入) | 传输实体 |
PUT(修改) | 传输文件 |
DELETE(删除) | 删除文件 |
get vs post
get不带有请求正文,post带有请求正文
URL
<协议名称>://<主机名>/<资源路径>?<查询字符串>#<片段标识符>
http vs https
http:不安全的,是明文传输、标准端口是80
https:安全的,是具有安全性的ssi加密传输、标准端口是443
状态码
类别 | 原因短语 | |
---|---|---|
1XX | 信息性状态码 | 接受的请求正在处理 |
2XX | 成功状态码 | 请求正常处理完毕 |
3XX | 重定向状态码 | 需要附加操作完成请求 |
4XX | 客户端错误状态码 | 服务器无法处理请求 |
5XX | 服务器错误状态码 | 服务器处理请求出错 |
200:OK
301:资源移至新位置(永久搬家)
302:重定向
304:Not Modified,若请求的资源未改变,浏览器不返回任何资源。客户端会缓存访问过的资源
307:临时重定向
400:Bed Request,请求语法错误
401:Unauthorized,用户需验证
403:Forbidden,无权限
404:Not Found,资源不存在
500:服务器内部错误
502:Bad Gateway,作为网关或代理的服务器尝试请求时,从远程服务器收到一个无效响应
504:Gateway Time-out,作为网关或代理的服务器,未及时从远端服务器获取请求
常见报头
报头 | 说明 | Request | Response |
---|---|---|---|
Content-Type | 正文数据类型 | √ | √ |
Content-Length | 正文长度 | √ | √ |
Host | 客户端告知服务器,所需资源在哪个主机上的哪个端口 | √ | |
User-Agent | 声明用户的操作系统和浏览器版本信息 | √ | |
referer | 当前页面从哪个页面跳转过来 | √ | |
location | 搭配3XX,告诉客户端要去哪里访问 | √ | |
Cookie | √ | ||
Set-Cookie | √ |
自定义头:X
HTTP服务器
Session&Cookie
会话跟踪的原因
HTTP协议是无状态的协议,一旦数据交换完毕,客户端与服务器就会断开连接,即上次请求与这次请求没有关系,意味着服务器无法跟踪上会话,无法实现用户状态需要保持的场景。
Cookie可以通过客户端记录确定用户身份,Session通过在服务端确定用户身份。
Cookie
Cookie存在有效期,比如会话级别就是关闭浏览器就过期了
Cookie保存在本地是不安全的
Session
Session vs Cookie
Cookie以文本文件形式存储在客户端本地磁盘中,Session存储在服务器
Cookie可以被访问不安全,但Session值无法被访问更安全
Session会在一定时间内保存在服务器上,当访问增多,会占用服务器的性能
Cookie有大小限制
HTTP服务器+Session&Cookie
HTTP服务器+Session&Cookie+HTML
DNS
域名 -> IP地址
DHCP
自动给子网内新增主机结点分配IP地址