TCP IP HTTP 学习

计算机网络体系结构分层

7 应用层
6 表示层
5 会话层
4 传输层
3 网络层
2 数据链路层
1 物理层
  • OSI 参考模型中定义了每一层的作用
  • 定义每一层作用的是协议
  • 协议是约定,其具体内容为规范
  • 日常使用的是遵循各个协议具体规范的产品和通信手段
OSI七层模型 TCP/IP概念层模型 功能 TCP/IP协议族群
应用层 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示层 数据格式化,代码转化,数据加密 没有协议
会话层 解除或建立别的接点的联系 没有协议
传输层 传输层 提供端对端的接口 TCP,UDP
网络层 网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层 链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2

OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”

每个分层中, 都会对所发送的数据附加一个首部, 在这个首部中包含了该层必要的信息,如发送的目标地址以及协议的相关信息,通常,为协议提供的信息为包首部,所要发送的内容为数据,在下一层的角度看,从上一层收到的包全部都被认为是本层的数据.

网络中传输的数据包由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。首部的结构由协议的具体规范详细定义,在数据包的首部,明确标明了协议应该如何读取数据。

数据处理流程

1, 应用程序处理

首先应用程序会进行编码处理, 这些编码相当于OSI的表示层功能;
编码转化后, 邮件不一定发上被发送出去,这种何时建立通信连接何时发送数据的管理功能

2, TCP 模块的处理

TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。TCP 提供将应用层发来的数据顺利发送至对端的可靠传输。为了实现这一功能,需要在应用层数据的前端附加一个 TCP 首部。

3, IP 模块的处理

IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端加上自己的 IP 首部。IP 包生成后,参考路由控制表决定接受此 IP 包的路由或主机。

4, 网络接口(以太网驱动)的处理

从 IP 传过来的 IP 包对于以太网来说就是数据。给这些数据附加上以太网首部并进行发送处理,生成的以太网数据包将通过物理层传输给接收端。

TCP 三次握手与四次挥手

三次握手 是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包.它的目的是链接服务器指定端口,建立TCP链接, 并同步李兰姐双方的序列号和确认好,交换TCP窗口大小信息.在 socket 编程中,客户端执行 connect() 时。将触发三次握手.

  • 第一次握手(SYN=1,seq=x):

    客户端发送一个 TCP的 SYN 标志位置1的包, 指明客户端打算连接的服务器的端口, 以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。

    发送完毕后,客户端进入 SYN_SEND 状态。

  • 第二次握手(SYN=1,ACK=1,seq=y,ACKnum = x+1)

    服务器发回确认包(ACK)应答,即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。

  • 第三次握手(ACK=1,ACKnum=y+1)

    客户端再次发送确认包(ACK), SYN 标志位为0, ACK 标志位为 1, 并且把服务器发来 ACK的序号字段 +1 放在确认字段中发送给对方, 并且在数据段放写 ISN的 +1

    发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。

TCP 的连接的拆除需要发送四个包,因此称为四次挥手,客户端或服务器均可主动发起挥手动作,在 socket 编程中,任何一方执行 close() 操作即可产生挥手操作。

  • 第一次挥手(FIN=1,seq=x)

    假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。

    发送完毕后,客户端进入 FIN_WAIT_1 状态。

  • 第二次挥手(ACK=1,ACKnum=x+1)

    服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。

    发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。

  • 第三次挥手(FIN=1,seq=y)

    服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。

    发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个ACK。

  • 第四次挥手(ACK=1,ACKnum=y+1)

    客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待可能出现的要求重传的 ACK 包。

    服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

    客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。

TCP 首部

TCP 是面向字节流的,在一个 TCP 连接中传输的字节流中的每个字节都按照顺序编号。

1、第一个4字节

(1)源端口,16位;发送数据的源进程端口

(2)目的端口,16位;接收数据的进程端口

2、第二个4字节与第三个4字节

(1)序号,32位;代表当前TCP数据段第一个字节占整个字节流的相对位置;

(2)确认号,32位;代表接收端希望接收的数据序号,为上次接收到数据报的序号+1,当ACK标志位为1时才生效。

3、第四个4字节

(1)数据偏移,4位;实际代表TCP首部长度,最大为60字节。

(2)保留 占 0.5 个字节 (4 位)。保留为今后使用,但目前应置为 0。

(3)6个标志位,每个标志位1位;

1
2
3
4
5
6
SYN,为同步标志,用于数据同步;
ACK,为确认序号,ACK=1时确认号才有效;
FIN,为结束序号,用于发送端提出断开连接;
URG,为紧急序号,URG=1是紧急指针有效;
PSH,指示接收方立即将数据提交给应用层,而不是等待缓冲区满;
RST,重置连接。

(4)窗口值,16位;标识接收方可接受的数据字节数

4、第五个4字节

(1)校验和,16位;用于检验数据完整性。

(2)紧急指针,16位;只有当URG标识位为1时,紧急指针才有效。紧急指针的值与序号的相加值为紧急数据的最后一个字节位置。用于发送紧急数据。

HTTP

HTTP 协议构建于 TCP/IP 协议之上,是一个应用层协议,默认端口号是 80
用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应报文。

报文的首部内容由以下数据组成

请求行—包含用于请求的方法,请求 URI 和 HTTP 版本。

状态行—包含表明响应结果的状态码,原因短语和 HTTP 版本。

首部字段—包含表示请求和响应的各种条件和属性的各类首部。

报文都是默认ASCII文本

    1. 请求方法: HTTP 定义了与服务器交互的不同方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。
    1. 为请求对应的URL地址
    1. 是协议名称及版本号
  • 4) HTTP的报文头

    首部字段 解释
    Accept 告诉服务器能够发送哪些媒体类型
    Accept-Charset 优先的字符集
    Accept-Encoding 优先的内容编码
    Accept-Language 优先的自然语言
    Authorization web认证信息
    Expect 期待服务器的特定行为
    From 用户的电子邮箱地址
    Host 请求资源所在服务器
    If-Match 比较实体标记(ETag)
    If-Modified-Since 比较资源的更新时间
    If-None-Match 比较实体标记(与If-Match相反)
    If-Range 资源未更新时发送实体Byte的范围请求
    If-Unmodified-Since 比较资源的更新时间(与If-Modified-Since相反)
    Max-Forwards 最大传输逐跳数
    Proxy-Authorization 代理服务器要求客户端的认证信息
    Range 实体的字节范围要求
    Referer 对请求中URL的原始获取方
    TE 传输编码的优先级
    User-Agent HTTP客户端程序的信息
  • If-Match:只有当 If-Match 字段值跟 ETag 值匹配一致时,服务器才会接受请求

    • 它会告知服务器匹配资源所用的实体标记(ETag)值,这时服务器无法使用弱ETag值
    • 仅当两者一致时才会执行请求,否则返回412 Precondition Failed的响应
    • 还可以使用 * 号指定If-Match的字段值,如果这样的话,那么服务器将会忽略ETag的值,只要资源存在就处理请求。
  • If-Modified-Since

    若资源更新时间确实在此字段指定时间之后的话,则处理该请求,否则返回304 Not Modified

用于确认代理或客户端拥有本地资源的有效性,若想获取资源的更新日期时间的话可以通过确认首部字段Last-Modified来确定

  • If-None-Match

    只有在 If-None-Match 的字段值与ETag值不一致时, 才可以处理该请求,与前文中提到的 If-Match作用相反

  • If-Range

    他告知服务器若指定的If-Range字段值(ETag值或者时间)和请求资源的ETag值或时间一致时,则作为范围请求处理,否则,返回全体资源

  • If-Unmodified-Since

    指定的请求资源只有在字段值内指定的日期时间之后未发生更新,才会执行这个请求,否则,返回412 Precondition Failed状态响应,与If-Modified-Since作用相反

  • Max-Forwards

    每次请求转发时数值减一,直到0时返回响应有可能这个请求经过了多台服务器代理转发,如果突然间请求出现了什么问题导致转发失败,而客户端不知道,此时就可以用此属性来定位问题,这个时候我们就可以掌握一个出问题的转发路径,从而方便进一步的排查问题。

  • Range

    • 对于只需要获取部分资源的范围请求,Range字段可以指定获取资源范围Range: bytes=10001-20000
    • 例子中表示请求获取从第10001字节到20000字节的资源
    • 服务器处理请求后会返回206 Partial Content的响应。无法处理时,则会返回状态码200 OK的响应及其全部资源

响应报文首部

首部字段名 解释
Accept-Ranges 是否接受字节范围请求
Age 推算资源创建经过时间
ETag 资源的匹配信息
Location 令客户端重定向至指定URL
Proxy-Authenticate 代理服务器对客户端的认证信息
Server Http服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息
  • Accept-Ranges

    Accept-Ranges:bytes 可以处理范围请求
    Accept-Ranges:none 不可以处理范围请求

  • Age

    • 可以告知客户端,源服务器多久之前创建了资源,单位是秒
    • 若创建该响应的缓存服务器, 则Age值是指定缓存后的响应再次发起认证到认证完成的时间值, 代理创建响应时必须加上首部字段Age
  • ETag 他是一种可资源的以字符串形式做唯一标识的方式,