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 | SYN,为同步标志,用于数据同步; |
(4)窗口值,16位;标识接收方可接受的数据字节数
4、第五个4字节
(1)校验和,16位;用于检验数据完整性。
(2)紧急指针,16位;只有当URG标识位为1时,紧急指针才有效。紧急指针的值与序号的相加值为紧急数据的最后一个字节位置。用于发送紧急数据。
HTTP
HTTP 协议构建于 TCP/IP 协议之上,是一个应用层协议,默认端口号是 80
用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应报文。
报文的首部内容由以下数据组成
请求行—包含用于请求的方法,请求 URI 和 HTTP 版本。
状态行—包含表明响应结果的状态码,原因短语和 HTTP 版本。
首部字段—包含表示请求和响应的各种条件和属性的各类首部。
报文都是默认ASCII文本
- 请求方法: HTTP 定义了与服务器交互的不同方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。
- 为请求对应的URL地址
- 是协议名称及版本号
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 他是一种可资源的以字符串形式做唯一标识的方式,