TCP协议和HTTP协议

如题所述

第1个回答  2022-07-18
TCP/IP四层协议

TCP(Transmission Control Protocol 传输控制协议)

TCP协议是计算机网络中非常复杂的一个协议。

1. 它解决了以下问题:

(1). TCP协议可靠传输

网络环境复杂,保证数据准确无误到达

(2). TCP协议流量控制

感知对方压力并控制流量(比如网卡性能差异,造成接收压力,TCP可以减缓传输,控制流量。感受接收方的压力)

(3). TCP协议拥塞控制

感知网络压力并控制发送速度(如果网络出现拥塞,TCP可以控制发送速度感受网络的压力)

2. TCP报文

TCP协议是面向字节流的协议,不管传输什么数据,都需要转成字节,再传输

3. 应用场景

(1). 微信、QQ等APP消息发送接收

(2). 浏览器-服务器通信

(3). 其他可靠通信的场景

TCP的三次握手与四次挥手

(1). 三次握手

三次握手是建立连接的过程,当客户端向服务端发起连接时,会发一包连接请求数据,过去询问一下,能否与你建立连接,这包数据称为 SYN 包,如果对端同意连接,则回复一包 SYN+ACK 包,客户端收到后回复一包 ACK 包,连接建立,因为这个过程中互相发送了三包数据,所以称之为“三次握手”

为什么不是三次握手而不是两次握手?

这是为了防止因为已失效的请求报文,突然又传到服务器引起错误。三次握手本质上是为了解决网络信道不可靠的问题,为了在不可靠的信道上建立可靠的连接。

三次握手之后,客户端和服务器端都进入到了传递数据的状态。

(2). 传输确认

一包数据有可能会被拆成多包发送,如何处理丢包问题?

这些数据包到达的先后顺序不同,如何处理乱序问题?

针对这些问题,TCP协议为每一个连接,建立了一个发送缓冲区,从建立链接后的第一个字节的序列号为0,后面每个字节的序列号就会增加1。发送数据时,从发送缓冲区取一部分数据组成发送报文,在其TCP协议中会附带序列号和长度。接收端在收到数据后,需要回复确认报文,确认报文中的ACK等于接受序列号加长度,也就是下一包数据需要发送的起始序列号。这样一问一答的发送方式,能够使发送端确认发送的数据,已经被对方收到,发送端也可以发送一次连续多包数据,接收端只需要回复一次ACK就可以了。这样发送端可以把待发送的数据分割成一系列的碎片,发送到对端,对端根据序列号和长度,在接收后重构出来完整的数据,假设其中丢失了某些数据包,在接收端可以要求发送端重传。

TCP连接是全双工的,对于两端来说均采用上述机制。

(3). 四次挥手

假设客户端主动发起连接关闭请求,它需要将服务端发起一包 FIN 包,表示要关闭连接,自己进入中止等待1状态,这是第一次挥手。

服务端收到FIN包,发送一包 ACK 包,表示自己进入了关闭等待状态,客户端进入中止等待2状态,这是第二次挥手。

服务端此时还可以发送未发送的数据,而客户端还可以接收数据,待服务端发送完数据之后,发送一包 FIN 包,进入最后确认状态,这是第三次挥手。

客户端收到之后回复 ACK 包,进入超时等待状态,经过超时时间后关闭连接,而服务端收到ACK包后,立即关闭连接,这是第四次挥手。

为什么客户端需要等待超时时间?

这是为了保证对方已收到ACK包,因为假设客户端发送完最后一包ACK后就释放了连接,一旦ACK包在网络中丢失,服务端将一直停留在最后确认状态。客户端在发送完最后一包ACK包后等待一段时间,这时服务端因为没有收到ACK包,会重发FIN包,客户端会响应FIN包,重发ACK包,并刷新超时时间,这个机制跟三次握手一样,也是为了保证在不可靠的网络链路中,进行可靠的连接断开。

UDP协议是非连接的,发送数据就是把数据封装一下,然后从网卡发送出去就可以了,数据包之间并没有状态上的联系,正因为UDP这种简单的处理方式,导致它的性能损耗非常少,对于CPU内存资源的占用也远小于TCP,但是对于网络传输过程中时产生的丢包,UDP协议并不能保证,所以UDP在传输稳定性上要弱于TCP

TCP vs UDP 

TCP传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如传输网络,发送邮件,浏览网页等。

UDP的优点是速度快,但是可能产生丢包,所以适用于对实时性要求较高,但是对少量丢包没有太大要求的场景,比如域名查询,语音通话,视频直播等。UDP还有一个非常重要的应用场景,就是隧道网络,比如VPN,以及在SDN中用到的VXLAN.

网络套接字与通信过程

进程之间的通信:HTTP协议

计算机可以同时运行多个不同的进程,比如打开浏览器的同时,可以播放视频,那么如何识别是哪一个进程进行通信呢?

(1). 使用端口(Port)来标记不同的网络进程

(2). 端口(Port)使用16比特位表示0~2^16(0~65535)

套接字(Socket)是抽象概念,表示TCP连接的一段。

通过套接字可以进行数据发送或接收。

HTTP(HyperText Transfer Protocol: 超文本传输协议)

通过HTTP协议来获取互联网资源。包含着超链接,图片,视频等多媒体的副本,这个副本可以通过HTTP协议进行传输

互联网资源那么多,怎么获取    --通过地址获取

HTTP请求方法:

比较常用的请求方法

(1). GET:   获取指定的服务器资源

(2). POST:  提交数据到服务端

(3). DELETE:  删除指定的服务器端资源

(4). UPDATE:  更新指定的服务端资源

Web服务器工作流程

(1). 接受客户端请求:服务端接受客户端连接

(2). 接收请求报文,通过报文,服务端可以知道浏览器想要干什么,想获取或操作什么资源

(3). 处理请求

(4). 访问Web资源:通过路径去判断需要访问哪些资源

(5). 构造应答:构成应答报文

(6). 发送应答:把应答报文发送给浏览器

HTTP协议的请求报文详解

请求报文的主要内容

1. 请求行:不管有多少内容,都只有一行

包含:请求方法(GET,POST等),请求地址(唯一对应Web服务器的资源),HTTP版本

2. 请求头:

通信的附加信息:比如说明当前手机还是计算机

格式:<key>:<value>

常用的请求头:

实例:

3. 请求内容

发送数据

数据格式是不固定的,只要客户端和服务端协商好就可以

注意:请求内容不是必须的

4. 实例

HTTP协议的应答报文详解

1. 状态行

状态码:三位数

304: 客户端缓存的数据并没有发生变化,不需要再次请求后台,可以直接使用本机缓存,即304为重定向到本机缓存

2. 应答头

和请求头类似

常用的应答头

3. 实例: