深入浅出HTTP
这一部分主要是介绍了URI和URL的概念、介绍了OSI七层模型、TCP/IP四层模型,讲了如何理解这些模型。重点讲了TCP协议的三次握手和四次挥手过程,捎带讲解了一些TCP报文的内容
URL和URI
URI(uniform resource identifier--统一资源标识符)
表示定位到互联网上的某个资源,含义更加宽泛(文件服务器、邮件地址等),而URL是URI的一种更具体的形式,即表示某个网页资源
URI的结构:
协议:http/ftp/ldap/mailto
登录信息:用户名和密码,例如user:pass。一般不这样使用(不安全)
服务器地址
端口号:一般默认端口号(80)
带层次的文件路径
查询字符串
片段标识符(hash):RFC并没有明确规定其使用,例如锚点
TCP/IP四层模型
问题:
Q: 什么是OSI七层模型
A: OSI规定的建立网络传输需要的通信结构,OSI七层模型:物理层->数据链路层->网络层->传输层->会话层->表示层->应用层,实际应用并没有采用这种形式,问题在于某一层的功能在另外一层有重叠(表示层、会话层没有具体的实现来表示,其核心功能更多的在传输层和应用层体现出来)
Q:什么是TCP/IP四层模型
A:见下例
Q:应用层和传输层有哪些协议
A:见正文
Q:如何理解TCP/IP四层模型
根据发信、收信过程来理解这四层模型中每一层的职责所在
TCP/IP四层模型
例子:
两个人写信:A B
- A要给B写信,必须要遵循规范(信头和签名等)
- 管家给A发信
- 管家:我要发信了
- B的管家:收到,请发,能收到吗?
- 管家:收到
- 发信的时候要把B的门牌号写到信封上
- 邮差需要管家把具体地址和小区名写到信封上
- 邮筒要求信封的尺寸不能大于7寸,并且需要贴邮票
分层是为了明确角色职责,只需要关注数据内容,通信双方的交流前提是应用层,而不关注其它层的功能
1对应的是应用层(负责数据内容,内容本身有一定规则),例如http请求本身,就有一套规则
2对应的是传输层(端到端的可靠性,确定内容可以按照正确顺序抵达对方、为数据添加一些其它内容,例如端口号信息(哪个应用))
3对应的是网络层(单一网络上传输数据包,给数据加上ip(协议)地址,即解决数据发给谁的问题)
4对应的物理链路层(负责真正的数据传递过程,底层硬件的运行逻辑)
每个应用层协议一般都会使用传输层的TCP和UDP协议:
运行在TCP协议上的协议有:
- HTTP(80)主要用于普通浏览
- HTTPS(443)HTTP协议的安全版本
- FTP(20、21)文件传输
- POP3(110)收邮件
- SMTP(25)发送电子邮件
- SSH(22)加密安全登录
运行在UDP协议上的协议有:
- DHCP(67)动态主机配置协议,动态配置IP地址
其它
- DNS 完成地址查找,邮件转发等工作(TCP、UDP协议之上)
- SNMP(Simple network management protocol)网络信息收集、网络管理
- ARP(Address resolution protocol 地址解析协议)动态解析以太网硬件的地址
TCP协议的三步握手
问题(答案就是正文内容):
- 什么是TCP的三步握手
- 什么是TCP的四步挥手
- 为什么握手要三步,挥手需要四步
定义:TCP(transmission control protocol)是面向连接的、可靠的、基于字节流的传输层通信协议。与之对应的UDP(user datagram protocol)是不可靠(只管发,不管接)的
三步握手(建立通信):
例子:
A和B用对讲机交流(对讲机、说话的时候对方听不到)
- A说准备好了,收到请回答
- B说准备好了,收到请回答(如果停在这一步,B不知道A知道B已经准备好了的信息,即双方需要互相确认一次信息)
- A说收到
- 开始交流
实际情况
客户端A->服务器B
- A发送数据 SYN=1(准备好了,问B),seq=x(保证序列)
- B收到,发送数据(SYN=1,ACK=1,seq=y,ack=x+1),SYN表示B准备好了,ACK表示回答并且回问?seq为ACK的顺序,ack代表它回答的是A的seq的问题
- A收到,发送数据(ACK=1,seq=x+1,ack=y+1),ACK表示回答B的ACK,seq为A的发言顺序,ack表示按顺序回答B的问题
- 连接建立
SYN表示询问、ACK表示回答,即第一次A询问,第二次B回答并且询问,第三次A回答,每次发送的都是一个TCP报文,而这些信号都在报文中(ACK对应的ack要对应SYN的seq)。ACK和SYN的值只有(0,1),1表示此状态有效,0表示无效
四步挥手(结束通信):
- A发送数据 FIN=1,seq=u
- B发送数据 ACK=1,ack=u+1,seq=v(不需要响应)--发送之后开始关闭(关闭过程需要服务器处理剩下的工作,例如发送剩余数据)
- B发送数据 FIN=1,ACK=1,ack=u+1,seq=w --关闭之后发送
- A发送数据 ACK=1,ack=w+1,seq=u+1
- 双方连接关闭
为什么要四步?
服务端的listen状态下的socket当收到客户端建立连接请求的SYN报文后,它可以把SYN和ACK放在一个报文中发过去,但是关闭连接时,当服务器收到客户端的FIN报文通知,服务器只能发一个回应报文,然后通知应用程序,应用程序完成发送全部数据并可以确定终止,服务器才能发送FIN告诉客户端可以真正断开连接了,所以这一步需要分两步发送报文