在长达一个月左右的颓废生活后,计算机学习又一次有了推进,目前的学习包括了基础,操作系统(linux),数据结构和算法几个部分,好像也忘得差不多了。。赶紧进行网络,数据库和设计模式的学习,早日用项目来夯实基础。
带着问题学网络
1. 请简述TCP\UDP的区别,为什么UDP有时比TCP更有优势?
2.请简单说一下你了解的端口及对应的服务?
- 21:FTP(文件传输协议)
- 22:SSH
- 80:HTTP(超文本传输协议)
- 53:DNS域名服务器
- 443:HTTPS
- 1080:SOCKETS
- 3306 Mysql服务
3.GET 和 POST 区别
4.dns使用的协议:UDP
5.幂等(乐观锁和悲观锁)
6.Cookies和session区别
7.TCP粘包和拆包产生的原因及解决策略
8.三次握手和四次挥手
9.TIME_WAIT和CLOSE_WAIT
10.一次完整的HTTP请求过程
11.讲一下长连接
12.TCP如何保证可靠传输?
13.详细介绍http
14.URL和URI的区别
15.HTTPS和HTTP的区别
16.https是如何保证数据传输的安全
17.IP地址分为哪几类?简单说一下各个分类
18.在浏览器中输入网址之后执行会发生什么?
19.简单解释一些ARP协议的工作过程
1. 分层的概念
1.1 标准化工作及相关组织
1.1.1 标准化工作
graph LR A[标准化分类]-->B(法定标准) B-->D(由权威机构制定的正式的合法的标准OSI) A-->C(事实标准) C-->E(某些公司产品在竞争中占据了主流这些产品中的技术和协议就成为标准TCP/IP)
1.1.2 因特网标准的形式
RFC:Request For Comments———-因特网标准的形式
RFC上升为因特网正式标准的四个阶段:
- 因特网草案(还不是RFC文档)—>建议标准(形成RFC文档,提交IEFT,IAB审核)—>因特网标准
1.1.3 相关组织
- 国际标准化组织ISO:OSI参考模型,HDLC协议
- 国际电信联盟ITU:制定通信规则
- 国际电气电子工程师协会IEEE:IEEE802系列标准,5G
- Internet工程师任务组IETF:负责因特网相关标准的制定
1.2 性能指标
速率:数据率或称数据传输率或比特率
连接在计算机网络上的主机在数字信道上传送数据位数的速率:以每秒传送的bit数作为单位
带宽:区别于模拟信号所指的频带范围
表示网络的通信线路传送数据的能力,通常是指单位时间内从网络中的某一点到另一点所能通过的“最高数据率”,单位和速率单位相同,即网络设备所支持的最高速度。
吞吐量:单位时间内通过某个网络(或信道,接口)的数据量。单位b/s,kb/s.Mb/s。吞吐量受网络的带宽或网络的额定速率限制。
时延:指数据(报文/分组/比特流)从网络(或链路)的一端传送到另一端所需的时间。也叫延迟或迟延。单位是s。
时延带宽积:传播时延*带宽
即以bit为单位的链路长度,即“某段链路现在有多少bit”
往返时延RTT
从发送方发出数据开始,到发送方收到接收方的确认(接收方收到发送后立即发送确认),总共经历的时延。
利用率
- 信道利用率
- 网络利用率
1.3 分层结构
1.3.1 为什么要有分层呢?
以文件发送为例:为了实现文件在两台电脑间的传输,要完成包括对数据通信的通路进行激活,告诉网络如何识别目的主机,发起通信的计算机要查明目的主机是否开机且与网络连接正常。。。等很多工作。分层结构即是将众多问题拆分解决。
1.3.2 怎么分层及分层基本原则
- 以一瓶82年拉菲的快递运输为例:
- 正式分层结构
如图中所示,第5层的data就是第四层的SDU,通过结合第四层的PCI,得到PDU;然后PDU交由第三层进行服务,作为第三层的SDU,又和第三层的PCI结合。以此类推,各个层次完成各层功能。
- 概念总结
1.4 参考模型
1.4.1 OSI参考模型
graph LR A[计算机网络分层结构]-->B(7层OSI参考模型) B-->C(法定标准) A-->D(4层TCP/IP参考模型) D-->E(事实标准) F[5层体系结构]-->G(方便理解和学习)
国际标准化组织(ISO)于1984年提出开放系统互联(OSI)参考模型。
通信过程:中间系统没有上面四层
1.4.2 OSI参考模型各层功能及协议
应用层:所有能和用户交互产生网络流量的程序(QQ和邮箱等)
典型应用层服务:文件传输(FTP);电子邮件(SMTP);万维网(HTTPs)…
表示层:用于处理在两个通信系统中交换信息的表示方式(语法和语义)
- 功能1:数据格式变换(翻译官)
- 功能2:数据加密解密
- 功能3:数据的压缩和恢复
会话层:向表示层实体/用户进程提供建立连接并在连接上有序的传输数据。这是会话,也是建立同步(SYN)
- 功能1:建立、管理、终止会话(比如打开的每个应用程序的服务器不会相互影响)
- 使用校验点可使会话在通信失效时从校验点/同步点继续恢复通信,实现数据同步。(适用于传输大文件)
主要协议:ADSP,ASP
传输层:负责主机中两个进程的通信,即端到端的通信。传输单位是报文段或用户数据报。
- 功能1:可靠传输、不可靠传输
- 功能2:差错控制
- 功能3:流量控制
- 功能4:复用分用
主要协议:UDP ,TCP
上面四个分层都是指向目的端口,下面3层都是指向下一个要传输的节点(路由器,交换机等)
网络层(最重要):主要任务是把分组从源端传到目的端,为分组交换网上的不同主机提供通信服务。传输单位是数据报(若数据报过长,可划分为更小的单位:分组)数据分组的路由与转发
- 功能1:路由选择(选择最佳路径)
- 功能2:流量控制(收发速度不匹配)
- 功能3:差错控制(检查收到)
- 功能4:拥塞控制(若所有节点都来不及接受分组,而要丢弃大量分组的话,网路就处于拥塞状态。因此要采取一定措施,缓解这种拥塞)
- 功能5:异构网络互联
数据链路层:将网络层传下来的数据报组装成帧。数据链路层的传输单位是帧。
- 功能1:成帧(定义帧的开始和结束)开始和结束的二进制序列
- 功能2:差错控制 帧错+位错
- 功能3:流量控制
- 功能4:访问(接入)控制 控制对信道的访问
物理层(傻瓜层):在物理媒介上实现比特流的透明传输。物理层的传输单位是bit。
透明传输:指不管所传数据是什么样的比特组合,都应当能够在链路上传送。
- 功能1:定义接口特性
- 功能2:定义传输模式 (单工,半双工,双工)
- 功能3:定义传输速率
- 功能4:比特同步(时钟)
- 功能5:比特编码(物理层面)
1.5 TCP/IP参考协议
1.6 各层主要知识点
- 以太网帧的格式
- MTU的概念
- ARP协议(报文格式,查询原理,缓存)
2.网络层
- IP首部格式(16位分片标识,DF不分片标志,MF更多分片标志,13位偏移,8位生存时间TTL,16位的首部检验和等)
- IP分片
- IP选路(路由表)
- ICMP协议(网络层和传输层的联系)(ICMP协议的报文格式,报文的两大类:查询和差错,2种查询报文+5种差错报文)
3.传输层
- UDP协议:特点+首部各个字段
- TCP协议:特点+首部字段+可靠机制
- TCP连接控制机制: 三次握手,四次挥手,同时打开,同时关闭,半关闭
- 流量控制机制:滑动窗口机制,慢启动,拥塞避免,快速重传,快速恢复
- TCP超时重传机制:4个定时器
4.应用层
- dns协议(域名到ip地址的解析):dns协议的名字空间,dns指针查询(反向查找或逆向解析)基本原理,dns缓存
- ftp协议:弱化的掌握以下(活化石),两条连接:控制连接+数据连接,两种工作模式:pasv+port,各种ftp指令和响应码,frp断点续传,匿名ftp
- http协议:报文格式:请求报文、响应报文、请求头各种字段、响应头各种字段。http状态码
- https协议:https的详细握手过程,摘要算法,数字签名,数字证书的原理和过程
2. 物理层
物理层就是傻瓜层,专门负责搬运货物,通过定义标准让傻瓜能够来回搬运数据
2.1 概念
主要任务:确定与传输媒体接口有关的一些特性(定义标准)
- 机械特性:定义物理连接的特性,规定物理连接时所采用的规格、接口形状、引线数目、引脚数量和排列情况。
- 电气特性:规定传输二进制位时,线路上信号的电压范围,阻抗匹配,传输速率和距离限制等。
- 功能特性:指明某条线上出现的某一电平表示何种意义,接口部件的信号线的用途。
- 规程特性:定义各条物理线路的工作规程和时序关系
数据通信基础知识
通信双方的交互方式:
- 单工:只有一方通信(发出和接收),只有一条信道
- 半双工:双方都可通信,但任何一方都不能在同一时刻接收和发送,两条信道
- 全双工:互通有无
2.2 物理层参数
码元:以二进制信号为例,信号方波的一个小横条就是二进制码元,横条时间就是码元宽度
速率,波特,带宽
速率:
(1)码元传输速率:单位时间内数字通信系统所传输的码元个数(即脉冲个数或信号变化的次数),单位是波特(Baud),1波特表示数字通信系统一秒传输一个码元。
(2)信息传输速率:别名比特率,单位时间内数字通信系统所传输的二进制数的个数。(以4进制为例:一个码元就对应两个bit)
(1)1秒传输的码元数,(2)1秒传输的bit数!
2.3 传输介质
2.4 物理层两大设备*
中继器:
- 对信号进行再生和还原,对衰减的信号进行放大,保持与原数据相同,延长传输距离
- 两端的网络部分是网段,不是子网
集线器:(多口中继器)
3. 链路层(沟通物理层和网络层)(负责mac地址)
mac地址:用来确定网络设备位置的地址,mac地址用来在网络中唯一标识一个网卡!若有多个网卡,则有多个网络地址!
一个mac地址是6个字节,可用12个16进制数标识
3.1 基本概念
以太网帧的格式:
3.2 功能概述
数据链路层要未雨绸缪,将物理层可能发生的差错都提前准备好,加强物理层传输原始bit流的功能。
- 为网络层提供服务:无确认无连接服务(实时通信,误码率低),有确认无连接服务(目的主机返回确认信号,无返回则重发),有确认面向连接服务(事前建立连接,收到一个帧返回一个确认帧,发送方接收确认帧才继续发)。
- 链路管理:连接的建立,维持和释放(面向连接的服务)
- 组装成帧
- 差错控制(帧错,位错)
3.3 组帧
封装成帧(帧的组成即为了包裹网络层数据,MTU即链路层协议规定的可传送数据部分的大小)
透明传输(对于数据的bit组合和控制信息一样时(比如和上图的帧尾部相同,直接结束发送),采取适当措施,保证透明传输)
- 字节计数法
- 字符填充法(在和控制信号相同的编码前添加一个字节的转译字符)
- 零bit填充法:收尾帧都是
01111110
,然后数据部分每5位1后填一个0,接收方每5个1删一个0 - 违规编码法:
3.4 差错控制
差错产生原因:电气特性携带的噪声;外界冲击噪声
分类:帧错(链路层为网络层),位错
为何要实现差错控制:发送节点和目的节点间可能有多个节点,如果到了目的节点才发现错误发回重传请求就太晚了。
3.5 流量控制和可靠传输机制*
可靠传输:发送端发啥,接收端收啥!
流量控制:控制发送速率,使接收方有足够的缓冲来接收(较高的发送速度和低的接收速度不匹配,此时就需要流量控制)
链路层和传输层的流量控制的区别:
链路层是点到点的,传输层是端到端的
链路层控制手段:接收方收不下就不回复确认;
传输层:接收方给发送方一个窗口公告
流量控制的方法:
- 停止等待协议:简单,但是信道利用率低
- 滑动窗口协议:对停止等待协议的优化!后退N帧协议(GBN)||选择重传协议(SR)
停止等待协议,或者说滑动窗口解决了哪些问题?
- 流量控制:收不下就不给确认,发不出来
- 可靠传输:发送方自动重传
停止等待协议:(现在都是放在传输层,可以让链路层的工作减轻,数据传输速率更快)
为什么要有停止等待协议?
除了bit出差错,底层信道还会出现丢包问题(物理线路故障, 设备故障,病毒攻击,路由信息错误等原因,会导致数据报的丢失)。
同时也是为了实现流量控制
什么是停止等待协议?
每发送一个分组就停止发送,等待对方确认,在收到确认后再发送下一个分组。
停止等待协议-有差错情况
保留副本可以在帧丢失或出错时重传,编号可以解决帧的丢失和重复等出错问题
(2)ACK丢失:同样根据超时重传机制,发送方在超时后重发,接收方丢弃重复的帧,重发确认帧
(3)ACK迟到:同上面丢失一样启动重传机制,区别在于ACK到达后被直接丢弃
停止等待协议的优缺点:
有点:简单;缺点:信道利用率低
滑动窗口中的后退N帧协议GBN:
需要注意的几点:
- 累积确认,即对于ACKn,发送方认为n帧即以前的帧均发送正确
- 接收方只按序接收帧,不按序无情丢弃
- 确认序列号最大的,按序到达的帧,哪怕后序接收到发送同样如此,类似于催更
- 优缺点:提高信道利用率;缺点:累计确认导致的批量重传问题
选择重传协议SR:
4. 网络层(负责IP地址)
4.1 基本功能
4.2 数据交换方式
电路交换
报文交换(存储转发思想)
分组交换(把大的数据块分割成小的数据)
分组交换是一种串行转发思想,而报文转发毫无疑问是并行的流水线思想
数据报方式:为网络层提供无连接服务(因特网在用)
- 每个分组都会携带源和目的地址
- 路由器根据分组的目的地址转发分组: 基于路由协议/算法构建转发表—>检索转发表—>每个分组独立选路
- 虚电路方式:为网络层提供连接服务
- 建立连接:每个分组携带虚电路号(确定路径),而非目的地址。源主机发送”呼叫请求“分组,并收到“呼叫应答”分组后才算建立连接
- 数据传输:
无连接服务:不事先为分组的传输确定传输路径,每个分组的传输路径可能不同,分组无法按序发送
连接方式:首先为分组的传输确定传输路径(建立连接),然后沿该路径(连接)传播系列分组,系列分组传输路径相同,传输结束后拆除连接,分组无需再排序组合
4.3 路由地址和路由转发协议
4.3.1 路由表
存放路由信息的地方!
- 路由条目必须包括的五项内容:
前缀+掩码: 表示为哪些数据报进行服务!
- 以10.1.1.0/24为例(也可以是25/26,因为10.1.1.0可以理解为网络号,/后面的是子网掩码为1的位长度):此时可以服务的网段:10.1.1.1-10.1.1.255
下一跳/出接口:从哪个接口转发出去
管理距离(AD)(优先级——对应路由表的pre):由本条路由使用的路由协议决定
度量(开销——对应路由表的cost)
- 路由器转发IP数据报的原则:
有路由匹配就转发,没有就丢弃
- 路由表的前缀和掩码已经决定了路由器的服务范围,不在范围内的路由(10.2.2.0/24)就直接丢弃
匹配多条路由时遵循最长匹配原则
- 即如果有多个匹配目的网络的路由条目,则路由器会选择掩码最长的条目
路由表生成的3中途径:
- 直连自动生成
- 静态路由协议
- 动态路由协议
4.3.2 路由协议
路由协议用于路由器之间帮助路由器构建路由表的网络协议
对于小型网络(家庭):只需要静态路由协议和直连就可以构建完整路由表
对于大型网络:必须使用动态路由协议让路由器之间相互学习路由信息,从而构建完整的路由表
4.4 IP
4.4.1 IP首部格式
- IP数据报和分组的关系:IP数据报过长,超出MTU的范围,就需要进行分片,分片的结果即分组
- TTL(生存时间):经过一个路由器减一。 字段为 0 时,数据报被丢弃,并且发送 ICMP 报文通知源主机。 目的是防止数据报在选路时无休止地在网络中流动。
- 协议:
4.4.2 IP数据报分片
由标识,标志和片偏移决定
标识:同一数据报的分片使用同一标识
标志:3位,只有后两位有意义,中间位(DF)决定是否分片,最低位(MF)决定后面还有没有分片
DF=0:分片,此时MF的值才有意义!DF=1:禁止分片
MF=1:后面还有分片,=0:不是最后一片或者没有分片!
片偏移:分片在原本数据报中的相对位置,以8Byte为单位
4.4.3 IPv4地址
IP地址的历史阶段:分类的IP地址——子网的划分——构成超网
IP地址的概念:全世界唯一的32位/4字节的标识符,标识路由器/主机的接口,比如有线和无线就是不同接口,路由器连接的多个主机或路由器同样是多个接口
- IP地址::{网络号,主机号}
IP地址的分类
比如同一网络上的主机数过多时就需要考虑主机号的位数
特殊网址
第二行错误,源地址和目的地址栏应该和第一行相同
第三行:向本网的所有主机发送广播,路由不转发
第五行:向特定值指向的网络发送广播
私有IP地址(内部IP地址)
- 网段个数:网络号的个数
- 路由器对目的地址是私有IP地址的数据报一律不进行转发
问题来了:本地和互联网如何建立通信呢?
4.4.4 网络地址转换NAT(Network Address Translation)
实际上也就是对公网IP地址通过端口号进行划分
4.4.5 子网划分和子网掩码
子网划分:解决IP分类造成的IP地址资源浪费和地址分配不灵活的问题
即首先通过网络号找到路由器,再根据子网号找到子网,最后再根据主机号找到主机!
二级IP地址的子网掩码:所有的网络号全1,主机号全0
三级IP地址的子网掩码:所有的网络号和子网号全1,主机号全0
由此可见子网掩码的作用就是标识哪些位标志网络/子网号,哪些位标志主机号
4.5 ARP协议
局域网内部:
每个主机和路由器都有一个ARP高速缓存(局域网内部),如果高速缓存中没有目的IP地址对应的MAC地址,就需要ARP协议进行获取
不同网络:
- 1号主机检索过后发现目的IP地址和自己不在同一网段,则下一跳会自动选择默认网关!这时候就需要默认网关路由器的MAC地址
- IP地址自始至终是不变得,因为IP协议是端到端的,但是mac地址是随着链路的改变不断变化的!
4.6 ICMP协议(网际控制报文协议)
功能:支持主机
- 差错(或异常)报告
- 网络探询
4.6.1 差错报告报文
1、差错报告分类
2、差错报告报文字段
3、不应发送ICMP差错报告报文的情况
4.6.2 网络探询报文
2、应用
PING:测试主机之间的连通性,使用ICMP回送请求和回答报文。利用了网络探询的功能
TRACEROUNTE:跟踪一个分组从原点到终点的路径,使用了ICMP时间超过差错报告报文
4.7 DHCP协议
IP地址的动态配置:
当有主机加入局域网当中,DHCP服务器就会自动从地址池中分配IP地址,当主机离开后将IP地址收回地址池。
5. 传输层
5.1 传输层概述(只有主机才有的层次)
5.1.1功能:
传输层提供进程和进程之间的逻辑通信,网络层提供的是主机和主机之间的逻辑通信
复用和分用
以送快递为例:由快递员对多个购物人的快递进行揽收和同一发送就是服用;将快递送到每个购物人手里就是分发(购物人即进程)
传输层对收到的报文进行差错控制(传输层对数据报进行检错,网络层则只需要检测IP数据报的头部)
5.1.2 寻址与端口
常用端口号
5.2 UDP(无连接的用户数据报协议)
5.2.1 UDP协议概述
- 无连接
- 不可靠
- 面向报文
5.2.2 UDP首部格式
5.2.3 数据检验和如何实现
- 伪首部的意思就是假的IP首部(因为包含IP源和目的地址),12字节,用于构造数据检验和
- 17:协议字段,标识该报文使用UDP协议,解析时也用UDP协议进行解析
- 填充伪首部
- 全0填充检验和字段
- 全0填充数据字段,使其为4字节的整数倍
- 伪首部+首部+数据部分:求和(补码),再将和求反码填入检验和字段
- 去掉伪首部-发送
接收端
- 填充伪首部
- 将三部分求和(补码)
- 结果为1则无差错,否则丢弃数据报/交给应用层附上出错警告
5.3 TCP协议
5.3.1 特点
类似于两个应用进程之间打电话:只有当接收方确认接收才能发送数据
- 面向连接
- 点对点
- 可靠有序,不丢不重
- 全双工
- 面向字节流(区别于UDP的面向报文)
5.3.2 首部格式
- 序号(4字节):如下图所示的字节流中的每个字节都有自己的编号,当TCP缓存中的数据添加首部封装为报文的时候,首部后面紧跟的字节编号就是序号
- 确认号(4字节):由接收方发送给发送方,确认号为N,表示编号N-1之前的数据都已收到,下一个发送的序号应该为N
- 数据偏移(4bit):其实就是首部长度(因为选项和填充部分的存在,不一定就是20字节)
- 6个控制位:紧急位(URG),确认位(ACK),推送位(PSH),复位(RST),同部位(SYN),终止位(FIN)
- 窗口:发送本报文的一方的接收窗口,即允许对方发送的数据量(作为接收方一次只能接收的数据量)
- 检验和:同样依靠12字节的伪首部,和UDP不同的地方是第四个字段(协议字段)的值为6
- 紧急指针:URG=1时生效,指出紧急数据的字节数(从紧跟首部的第一个字节开始)
- 选项:最大报文段长度MSS,窗口扩大,时间戳,选择确认。。。
首部中的很多参数都是为了实现面向字节流设置的:
5.3.3 TCP连接管理
TCP传输的三个阶段:
建立连接>>数据传送>>连接释放
建立连接(3次握手):
连接释放(4次挥手):
实际连接、传送和释放过程
- 第三次握手和四次挥手的第二、三次之间不一定有数据传送
- 连接建立后会处于保持阶段,这时候客户机也可以向服务器发送数据(如cookie等),当然双方也都可以只回复确认不携带数据
5.3.4 TCP可靠传输
TCP实现可靠传输的机制:校验,序号,确认,重传
确认和重传两者相辅相成
重传由两方面决定:
- 自适应算法,动态调整RTTs(加权平均往返时间)
- 冗余ACK(冗余确认):解决超时重传造成的时间浪费
5.3.5 TCP流量控制
让发送方发慢点,要让接收方来得及接收
TCP利用滑动窗口机制实现流量控制
接收方在TCP缓存满的时候就向发送方发送窗口为0,此时停止发送,接收方会向应用层(进程)提交数据,此时窗口空闲,发送方可以发送
图中表示的就是滑动窗口机制下的流量控制:图中所示的接收方三次确认报文的窗口大小都是在限制发送方的窗口
第一次:接收窗口400字节,发送方就可以准备4个报文段
第二次:接收窗口300字节,确认号201,发送方就将窗口移动到201,且窗口大小为300个字节。
第三次:最后接收方的窗口大小为0,此时发送方将窗口移动到601,但窗口大小为0。
为了避免接收方窗口出现空闲时返回给发送方的确认信息丢失,导致死锁,此时发送方就需要启动持续计时器。
5.2.6 TCP拥塞控制
流量控制和拥塞控制的区别
流量控制是端到端的,因为接收方的窗口大小,限制发送方发送速度
拥塞控制是全局性的,因为网络发送堵塞,导致发送方发送的数据无法到达接收方
拥塞控制的四种算法
发送方增加拥塞窗口实际就是变相的增加发送窗口,网络拥塞即发送方检测到丢包现象
此时需要将cwnd重新调整为1,门限值调整为拥塞发生时cwnd的一半
考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将 cwnd 设置为 ssthresh 的大小,然后执行拥塞避免算法。
6. 应用层
6.1 概述
6.2 网络应用模型
6.2.1 客户/服务器(c/s)模型
6.2.2 p2p(peer to peer)模型
6.3 域名解析系统DNS
6.4 文件传送协议FTP
功能:提供不同种类主机系统(硬,软件体系等都可以不同)之间的文件传输能力
6.5 万维网和Http协议
6.5.1 http协议的概念
简单来说就是规定如何上网,以及服务器如何提供服务
http入口端口80:
这里的端口80,就类似于FTP协议的21端口,其作为主进程,负责判断是否有主机向服务器发送请求,一旦接收到请求后就可以建立TCP连接,实现数据传输
端口80这一主服务进程可以理解为理发店的迎宾, 当客户需要剪头,烫头,染发等服务的时候就找到相应的从服务进程。
浏览器可以不用一次传输全部资源
可以先只下载文本部分,需要图片,音频,视频等资源的时候可以再点击链接,重复图中的8步过程。
- HTTP本身无连接,即不需要接收方发送http应用层面的确认信息,只需要TCP网络层进行三次握手即可建立连接
- 第二张图可以看出,TCP建立连接时的第三次握手就已经携带了客户方的请求报文。
- 持久/非持久连接、流水/非流水线
- 持久即保持连接不断开,在发送新的请求报文时可以立刻响应
- 流水线即可以同时发送多个请求报文, 服务器依次响应,客户访问所有资源只需要约一个RTT
6.5.2 http请求/响应步骤
客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成
释放TCP连接
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
1
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
- 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
- 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个
报文的数据发送给服务器; - 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
- 浏览器将该 html 文本并显示内容;
6.5.3 http请求的8种方法
HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:
GET
指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
HEAD
与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
POST
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
PUT
向指定资源位置上传其最新内容。- DELETE
请求服务器删除Request-URI所标识的资源。 TRACE
回显服务器收到的请求,主要用于测试或诊断。OPTIONS
这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*’来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。- CONNECT
7. 技术
7.1 内网穿透
为啥要内网穿透
网络地址转换(Network Address Translation,NAT)机制的问题在于,NAT设备自动屏蔽了非内网主机主动发起的连接,也就是说,从外网发往内网的数据包将被NAT设备丢弃,这使得位于不同NAT设备之后的主机之间无法直接交换信息。这一方面保护了内网主机免于来自外部网络的攻击,另一方面也为P2P通信带来了一定困难。Internet上的NAT设备大多是地址限制圆锥形NAT或端口限制圆锥形 NAT,外部主机要与内网主机相互通信,必须由内网主机主动发起连接,使 NAT设备产生一个映射条目,这就有必要研究一下内网穿透技术。
怎么做到的
- 通信双方有一台位于NAT后
一台主机有一个公网 IP,另一台主机有一个内网 IP。如图1所示,Client A 位于 NAT 之后,并拥有[IP 地址:端口]对[10.0.0.1:1234],Client B位于 NAT 之前,并拥有[IP 地址:端口]对[138.76.29.7:1234],NAT 拥有公网 IP 155.99.25.11。由于 Client B 有一个公网 IP,Client A 可以直接通过 TCP 连接到[138.76.29.7:1234],然而,如果 Client B 向 Client A 发起主动连接,则不会成功。此时,需要一个公有的服务器辅助进行内网穿透。Client A 和 Client B 向服务器发起登陆请求,并保持一个 TCP 或 UDP 连接,服务器记录其 IP 地址和端口号,这里服务器对 Client A 是记录其经过 NAT 映射之后的 IP 和端口号。当 Client B 想连接 Client A 时,首先向服务器提出请求,服务器在收到请求后向 Client A 发出打洞命令,并将 Client B 的[IP 地址:端口]对发给 Client A,Client A 根据接收到的 IP地址和端口号向 Client B 发起 TCP 连接或发送 UDP 数据包。接下来 Client A 和Client B 之间便可以建立数据传输通道。
- 通信双方都位于NAT后
两台主机都处于内网中,如图2所示。服务器记录的[IP 地址:端口]对是 Client A 和 Client B 经过 NAT 映射之后的IP 地址和端口号,此时,Client A 和 Client B 之间任意方向的连接请求都会被对方的 NAT 设备屏蔽。Client A 首先向服务器提出连接请求,服务器将 Client A 的 IP地址和端口号对[155.99.25.11:51200]发给 Client B,并向 Client B 发出打洞命令;Client B 收到服务器的打洞命令后首先向[155.99.25.11:51200]发送一定数目的 UDP探测包或 TCP 连接请求,在 NAT B 上打一个方向为[155.99.25.11:51200]的洞,Client B 随后向服务器报告打洞完成;服务器在收到 Client B 的报告后将 Client B 的公网IP 地址和端口号对[110.10.33.10:5000],此时由于 NAT B 上已经留下了对应于[155.99.25.11:51200]方向的洞,Client A 向[110.10.33.10:5000]发出的数据包或连接请求将不会被丢弃。