为了简化网络的复杂度,网络通讯的不同方面被分解为多层次的结构,每一层只与紧挨着的上层或者下层进行交互,将网络分层,这样可以修改,甚至替换每一层的软件,只要层于层之间的接口保持不变,就不会影响到其他层.
网络分层的两种模型
OSI(Open System Interconnection Reference Model):开放系统互联参考模型
TCP/IP 协议族
image.png
image.png
HTTP协议
超文本传输协议(HyperText Transfer Protocol HTTP)
一种无状态的,已请求/应道方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的草文本信息系统灵活互动.
HTTP协议的请求报文和响应报文的结构基本相同,有3部分组成
- 起始行(start line):描述请求或相应的基本信息
- 头部字段合集(header):使用key-value形式更详细的说明报文
- 消息正文(entity):实际传输的数据,他不一定是纯文本,可以是图片视频文件等二进制数据.
请求行报文格式
image.png - 请求方法:如GEY/HEAD/PUT/POST,表示对资源的操作
- 请求目标:通常是一个URI,标记了请求方法要操作的资源
- 版本号:表示报文使用的HTTP协议的版本
相应行报文格式
image.png - 版本号:表示报文使用的HTTP协议版本
- 状态码:一个三位数,用代码的形式表示处理结果,比如200是成功,500是服务器错误
- 原因:作为数字状态码的补充,是更详细的解释文字,帮组理解原因
HTTP头字段 - 头部字段是key-value的形式,key和value之间用 : 分割,最后用CRLF换行表示字段的结束,比如前后分离时,经常遇到要与后端协商传输数据的类型”content-type”:application/json,这里的key就是content-type,value就是application/json,HTTP头字段非常灵活,不仅可以使用标准的Host Connection等已有的头,还可以任意添加自定义头信息,这就给HTTP协议带来了无线的扩展的可能.
- 头部字段注意事项
1)字段名称不区分大小写,字段名称不允许出现空格,可以使用连字符”-”,但不能使用下划线(有的服务不会解析带的头部信息).字段名称后面必须紧接着”:”,不能有空格,而”:”后面的内容可以有空格或者多个空格.
2)字段的顺序没有意义
3)字段原则上不能重复
4)常用的字段头
HTTP协议中有非常多的头字段,但基本上可以4大类
1)请求字段:请求字段的头字段 Host Referer
2)响应字段:响应头中的头字段,如:server Date
3)通用字段: 在请求头和响应头里都可以出现,如Content-type
image.png
TCP
面向连接的,可靠的,基于字节流的传输层通讯协议
特点
基于连接的:数据传输之前需要建立连接
全双工:双向传输(客户端和服务端传输时双向)
字节流:不限制数据大小,打包成报文段,保证有序接受,重复报文自动丢弃(在实际环境中,会出现tcp在传输中并不只会一条线路,可能有多条线路传输数据,本地是有序的发送,传输过程中运营商会分派很多线路,传输的数据被切割成多个片段,由不同的tcp连接传输,可能导致接收端有乱序 重复的数据产生,tcp接收端会重新排序和去重)
流量缓冲,:解决双发处理能力的不匹配(发送端能力强接收端能力弱,就需要流量缓冲,将消息放到队列里一点点处理)
可靠性传输:保证可达,丢包时通过重试机制实现可靠性(如果网络抖动造成的重试,tcp接收端去重,每次发送完数据会接受到接收端传来的反馈,如果没有则重复发送)
拥塞控制:防止防落出现恶行的拥塞
TCP的3次握手
Tcp的报文
image.png
1、端口号:用来标识同一台计算机的不同的应用进程。
1)源端口:sourceport 源端口和IP地址的作用是标识报文的返回地址。端口是一般是客户端随机生成
2)目的端口:destport端口指明接收方计算机上的应用程序接口。服务端端口比如80 8080
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。
2、序号和确认号:
(sequence number/acknowledement number)是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。e.g.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。Tcp每一次传输是块的并不是一次全部传送,序号来排序,序号和确认号保证传输的可靠性.
3、数据偏移/首部长度(header length):
4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值
4、保留:为将来定义新的用途保留,现在一般置0。
5、控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能。
1)URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。
2)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。SYN=1和ACK=1是服务端返回应答报文,三次握手的第二部.
3)PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
5)SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。当SYN=1和ACK=0就是客户端发送报文用来建立连接.
6)FIN:
finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。四次挥手中用来确认即将断开连接的标识符.
6、窗口(receive window):
滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
7、校验和:
奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
8、紧急指针:
只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
9、选项和填充:
最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
10、数据部分:
TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
TCP三次握手
image.pngimage.png
image.png
TCP四次挥手
image.png
https://blog.csdn.net/kkgbn/article/details/77859881 详细的解释
网友评论