网络编程协议
2021-03-12 10:04:15 0 举报
AI智能生成
和Http协议的了解,和与其相关的一部分协议。
作者其他创作
大纲/内容
概况
网络请求图例
网络模型
TCP/IP四层网络模型
数据链路层:负责在以太网、WIFI等底层网络上发送原始数据包,利用MAC寻址
网络层:IP协议所在层,利用IP翻译成MAC地址,承接TCP层
传输层:保证数据在IP地址标记的两点间的“可靠性”传输,TCP为有状态协议
应用层:HTTP协议层,实现由Tomcat、Nginx等Web服务器
Http
报文
请求报文
请求行
请求方法
HTTP协议版本
请求头
空行
请求体
响应报文
状态行
响应头部
空行
响应体
超文本传输协议(HyperText Transfer Protocol)
协议:一种规则,根据这种规则进行实现
传输:客户端与服务端的数据传输
文本:文字、图片、视频、音频等,而非TCP网络间的二进制文件
Http和Https的区别
https是在http协议基础上增加了**使用SSL加密传送信息**的协议,http和https之间的区别就在于其传输的内容是否加密和是否是开发性的内容。HTTPS是安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。
- https协议需要到ca申请证书,一般免费证书很少,需要交费。
- http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
- http端口是80,https的端口是443。
- https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
- https协议需要到ca申请证书,一般免费证书很少,需要交费。
- http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
- http端口是80,https的端口是443。
- https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
Http1.0和Http2.0的区别
HTTP/2相比 HTTP/1.x,HTTP/2 在底层传输做了很大的改动和优化:
- HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 的文本格式。二进制格式在协议的解析和优化扩展上带来更多的优势和可能。
- 多路复用,多个请求一个连接。
- 头部压缩,由于 HTTP 1.1 经常会出现 User-Agent、Cookie、Accept、Server、Range 等字段可能会占用几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重。HTTP 2.0 使用 `HPACK` 算法进行压缩。
- HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 的文本格式。二进制格式在协议的解析和优化扩展上带来更多的优势和可能。
- 多路复用,多个请求一个连接。
- 头部压缩,由于 HTTP 1.1 经常会出现 User-Agent、Cookie、Accept、Server、Range 等字段可能会占用几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重。HTTP 2.0 使用 `HPACK` 算法进行压缩。
TCP
传输控制协议
主要关注五个问题:顺序问题、丢包问题、连接维护、流量控制、拥塞控制
每次发送数据包都需要接收到ack(保证可靠性)
头格式
Sequence Number是包的序号,用来解决网络包乱序(reordering)问题。
Acknowledgement Number就是ACK——用于确认收到,用来解决不丢包的问题。
Window又叫Advertised-Window,也就是著名的滑动窗口(Sliding Window),用于解决流控的。
TCP Flag ,也就是包的类型,主要是用于操控TCP的状态机的。
状态机
关于建连接时SYN超时:试想一下,如果server端接到了clien发的SYN后回了SYN-ACK后client掉线了,server端没有收到client回来的ACK,那么,这个连接处于一个中间状态,即没成功,也没失败。于是,server端如果在一定时间内没有收到的TCP会重发SYN-ACK。在Linux下,默认重试次数为5次,重试的间隔时间从1s开始每次都翻售,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 2^6 -1 = 63s,TCP才会把断开这个连接。
通讯过程
三次握手
过程
1、 首先客户端向服务器端发送一段请求连接TCP报文,报文内容:标记位SYN(发起新连接),序号Seq=X(一般为1),随后客户端进入SYN-SENT阶段。
2、服务器端接收到来自客户端的TCP报文之后,结束LISTEN阶段,并返回一段TCP报文,报文内容:标记位SYN、序号Seq=Y和确认号ACK=X+1,随后服务器端进入SYN-RCVD阶段。
3、客户端接收到来自服务器端的确认收到数据的TCP报文之后,明确了从客户端到服务器的数据传输是正常的,并再发送一段报文,报文内容:标记位ACK=Y+1,序号Seq=X+1。随后结束SYN-SENT阶段,进入ESTABLISHED阶段。
服务端接收到客户端第二次发送的报文之后也进入ESTABLISHED阶段
服务端接收到客户端第二次发送的报文之后也进入ESTABLISHED阶段
口述过程
口述:首先客户端会向服务端发送一个请求连接的一个TCP报文,其中包括syn标志位以及序号等信息,表示要和服务端建立一个新的连接,服务端接收到客户端的请求之后,会结束监听状态,进入到同步收到(syn-rcvd)状态,同时向客户端发送报文消息,意识是告诉客户端,我接收到你的信息,我们可以建立新的连接,但这时候服务端和客户端的连接还是没有创建的,因为网络会出现丢包或者漏包的一些情况,客户端有可能没有接收到服务端的确认消息,这时候如果服务端开启接收数据的时候会造成资源浪费问题,客户端在接收到服务端的确认消息之后会再次向服务端发送一个确认,意思是告诉服务端,我收到了你的确认消息了,服务端接收到信息之后就会结束同步接收状态,进入确认连接状态,这时候双方就可以收发信息了。
为什么是三次握手
如果是两次的时候,,服务端给客户端发送ack之后就开始开辟空间等客户端的数据,无法知道客户端是否有知道自己的ack是否被客户端接收。此时客户端却不发送数据,服务端就会一直在等待。
四次挥手
过程
1、首先客户端想要释放连接,向服务器端发送一段TCP报文,报文内容:标记位FIN,序号为Seq=U,随后客户端进入FIN-WAIT-1阶段,即半关闭阶段。并且停止在客户端到服务器端方向上发送数据(非确认报文),但是客户端仍然能接收从服务器端传输过来的数据。
2、服务器端接收到从客户端发出的TCP报文之后,确认了客户端想要释放连接,随后服务器端结束ESTABLISHED阶段,进入CLOSE-WAIT阶段(半关闭状态)并返回一段TCP报文,报文内容:标记位ACK,序号为Seq=V,确认号为Ack=U+1。客户端收到ACK后客户端结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段
3、服务端发送报文ACK报文之后,经历CLOSE-WAIT阶段,做好了释放服务端到客户端连接准备。再次向客户端发出TCP报文,内容:标记位FIN,序号Seq=W,ACK=U+1,随后进入LAST-ACK阶段
4、客户端收到从服务器端发出的TCP报文,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器端发送一段报文,内容:标记位ACK,序号Seq=U+1,Ack=W+1,随后客户端开始在TIME-WAIT阶段等待2MSL
过程口述
口述:如果客户端想要释放连接的时候会向服务端发送一个释放连接的报文,然后进入到一个半关闭的一个状态,这时候客户端可以接收服务端的消息,但不会再向服务端发送消息。服务端接收到释放连接报文之后,服务端也进入到半关闭的状态,同时向客户端发送确认关闭的消息。服务端经历了半关闭状态期间做好了释放连接的准备之后,会再次向客户端发送释放连接的报文,客户端接收到释放请求之后向服务端发送可以释放的报文,随后等待2MSL(最大存活时间)
为什么要四次挥手
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
0 条评论
下一页