深入浅出HTTP

深入浅出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

  1. A要给B写信,必须要遵循规范(信头和签名等)
  2. 管家给A发信
    1. 管家:我要发信了
    2. B的管家:收到,请发,能收到吗?
    3. 管家:收到
    4. 发信的时候要把B的门牌号写到信封上
  3. 邮差需要管家把具体地址和小区名写到信封上
  4. 邮筒要求信封的尺寸不能大于7寸,并且需要贴邮票

分层是为了明确角色职责,只需要关注数据内容,通信双方的交流前提是应用层,而不关注其它层的功能

1对应的是应用层(负责数据内容,内容本身有一定规则),例如http请求本身,就有一套规则
2对应的是传输层(端到端的可靠性,确定内容可以按照正确顺序抵达对方、为数据添加一些其它内容,例如端口号信息(哪个应用))
3对应的是网络层(单一网络上传输数据包,给数据加上ip(协议)地址,即解决数据发给谁的问题)
4对应的物理链路层(负责真正的数据传递过程,底层硬件的运行逻辑)

每个应用层协议一般都会使用传输层的TCP和UDP协议:

运行在TCP协议上的协议有:

  1. HTTP(80)主要用于普通浏览
  2. HTTPS(443)HTTP协议的安全版本
  3. FTP(20、21)文件传输
  4. POP3(110)收邮件
  5. SMTP(25)发送电子邮件
  6. SSH(22)加密安全登录

运行在UDP协议上的协议有:

  1. DHCP(67)动态主机配置协议,动态配置IP地址

其它

  1. DNS 完成地址查找,邮件转发等工作(TCP、UDP协议之上)
  2. SNMP(Simple network management protocol)网络信息收集、网络管理
  3. ARP(Address resolution protocol 地址解析协议)动态解析以太网硬件的地址

TCP协议的三步握手

问题(答案就是正文内容):

  1. 什么是TCP的三步握手
  2. 什么是TCP的四步挥手
  3. 为什么握手要三步,挥手需要四步

定义:TCP(transmission control protocol)是面向连接的、可靠的、基于字节流的传输层通信协议。与之对应的UDP(user datagram protocol)是不可靠(只管发,不管接)的

三步握手(建立通信):

例子:

A和B用对讲机交流(对讲机、说话的时候对方听不到)

  1. A说准备好了,收到请回答
  2. B说准备好了,收到请回答(如果停在这一步,B不知道A知道B已经准备好了的信息,即双方需要互相确认一次信息)
  3. A说收到
  4. 开始交流

实际情况

客户端A->服务器B

  1. A发送数据 SYN=1(准备好了,问B),seq=x(保证序列)
  2. B收到,发送数据(SYN=1,ACK=1,seq=y,ack=x+1),SYN表示B准备好了,ACK表示回答并且回问?seq为ACK的顺序,ack代表它回答的是A的seq的问题
  3. A收到,发送数据(ACK=1,seq=x+1,ack=y+1),ACK表示回答B的ACK,seq为A的发言顺序,ack表示按顺序回答B的问题
  4. 连接建立

SYN表示询问、ACK表示回答,即第一次A询问,第二次B回答并且询问,第三次A回答,每次发送的都是一个TCP报文,而这些信号都在报文中(ACK对应的ack要对应SYN的seq)。ACK和SYN的值只有(0,1),1表示此状态有效,0表示无效

四步挥手(结束通信):

  1. A发送数据 FIN=1,seq=u
  2. B发送数据 ACK=1,ack=u+1,seq=v(不需要响应)--发送之后开始关闭(关闭过程需要服务器处理剩下的工作,例如发送剩余数据)
  3. B发送数据 FIN=1,ACK=1,ack=u+1,seq=w --关闭之后发送
  4. A发送数据 ACK=1,ack=w+1,seq=u+1
  5. 双方连接关闭

为什么要四步?
服务端的listen状态下的socket当收到客户端建立连接请求的SYN报文后,它可以把SYN和ACK放在一个报文中发过去,但是关闭连接时,当服务器收到客户端的FIN报文通知,服务器只能发一个回应报文,然后通知应用程序,应用程序完成发送全部数据并可以确定终止,服务器才能发送FIN告诉客户端可以真正断开连接了,所以这一步需要分两步发送报文

深入浅出HTTP

上一篇:[Tips]:JavaScript命名空间


下一篇:SQL 绕圈算法???