一、引言
在网络数据传输过程中有可能会存在数据丢包、延时、重复等问题,为了使对数据传输的处理更加简单直观,对该过程进行分层。
1.1、OSI 7层参考模型
OSI(Open System Interconnection)7层参考模型,是国际标准化组织(ISO)制定的一个用于计算机或通信系统之间互联的标准体系,是一个七层的、抽象的模型体,不仅包含各种名词的抽象定义和概念,也包括,具体的协议。该模型总共分为应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
1.2、具体实现
TCP/IP协议在一定程度上参考了OIS7层模型,是具体的实现。已经成为目前网络传输中最基础的协议。协议分不同层次进行开发,每一层分别负责不同的通信功能。一个协议族,比如 ,是 一组不同层次上的多个协议的组合。通常被认为是一个四层协议系统,相比于OSI7层模型,少了表示层、会话层和物理层。
下图是一个使用FTP协议连接的局域网内的两台主机:
二、TCP/IP协议
2.1、概述
-
程序:应用层
-
公共内核(操作系统):传输控制层(也叫运输层TCP、UDP协议)、网络层(IP协议、ICMP、IGMP)、数据链路层(以太网协议)、物理层(有些书上不包括这一层)
-
端系统(end system):pc、服务器(应用层和运输层使用端到端协议end to end)
-
中间系统(intermediate system):路由器(网络层使用逐跳协议hop to hop)
-
环回地址:127开头的IP都是(127.0.0.1)
-
MTU:最大传输单元,以太网和802.3对数据帧的长度有限制,链路层的这个特性称作MTU,即
路径上最小的MTU,是路径MTU,因此MTU计算出方向MTU
-
MSS:最大消息长度,由发送端和接收端在连接建立时约定好
-
确认时延:最长等待200 ms确认是否有回复消息,然后将回复消息和确认消息一起返回。
Nagle算法:该算法要求一个TCP连接只能有一个未被确认的的未完成小分组,在该分组的确认到达之前不在发送其他的小分组。相反,发送端收集这些少量的分组,并在确认到来时以一个分组的方式发送出去。也就是每一次发送的待发数据是不一样的。
优点:自适应的,确认到达的越快,消息发送的越快。
代价:产生时延,会等到响应后再发送。因此我们在需要实时反馈的某些操作中不建议使用Nagle算法,例如鼠标移动等。
TCP成块数据流
-
正常数据流:隔一个报文进行确认,连同第一个报文一起确认
-
慢启动:为发送方的TCP建立一个拥塞窗口(congestion window–c w n d)降低一开始就发送过多数据到网络里
2.2、TCP、UDP协议(传输层)
TCP:提供面向连接的、可靠的连接
- URG:紧急指针有效
- ACK:确认序号有效
- PSH:接收方应该尽快将这个报文段交给应用层
- RST:重建连接
- SYN:同步序号,用来发起一个连接
- FIN:发端完成发送任务
UDP:为应用程序发送和接收数据报,不同于TCP,是不可靠的
三次握手:
- client—syn—>server
- client<—syn+ack—server
- client—ack—>server
四次分手
- client1—fin—>server
- client1<—fin+ack—server
- client1<—fin—server
- client1—ack—>client
TCP是可靠的,而IP是不可靠的,即TCP在不可靠的IP层上提供了一个可靠的传输层
TCP和UDP都用一个16bit的端口号来标识不同的应用程序(ftp telnet http)
2.3、IP协议(网络层)
- IP是网络层的主要协议,同时被TCP和UDP协议使用。
- ICMP通常被看作是IP协议的附属协议,它传递差错报文以及其他需要注意的信息。
- IGMP是支持主机和路由器进行多播的Internet组管理协议
- IP在首部存入一个长度8bit的数值,称作协议域(icmp igmp tcp udp esp gre)
2.4、以太网协议(数据链路层)
- 以太网数据帧的物理特性是其长度必须在46~1500字节之间
- 以太网的帧首部也有一个10bit的帧类型域(ip arp rarp)
2.5、数据报的封装和分用
数据报封装
数据报分用
三、滑动窗口管理
滑动窗口:窗口左边已发送且接收方已确认收到,窗口大小由接收方通知发送方
- 合拢:左边沿向右,发送方已收到且接收到接收方的确认
- 张开:右边沿向右,接收方已经收到数据且释放缓存区
- 收缩:不建议,可能会出现当前进程所分配到的内存减少
3.1、原理
如果数据要传输的数据较大,需要对文件进行分片时就会产生以下这种情况,每一次发送完数据,都需要等到接收端的返回数据才可以继续下一个数据包的传输,这样会在等待确认环节浪费大量的时间。
为了避免这种情况的发生,TCP引入了发送窗口的概念,如下,第一个数据包发送以后不需要等到确认回复就直接发送第二个数据包,同样的,第二个数据包也无需等到回复直接发送第三个,之后等收到第三个数据包的回应就继续传输。
TCP还有流控制和确认重发。
3.2、滑动窗口、带宽、RTT
- RTT:从发送端到接收端一来回的时间
- 带宽:单位时间内从发送端到接收端所能通过的"最高数据率",是一种硬件限制
传输速度和各参数间的关系,假设物理带宽为B,RTT为Tr,TCP一个RTT内发送的最大数据量为W,由此可以得出TCP发送数据的速率V=W / Tr,Tr可以看作理想状态下的定值,那么当V小于B的时候,那么唯一影响V的因素就是W,而W的大小由数据窗口的大小决定,即数据窗口的大小是唯一影响TCP发送速率的影响
3.3、滑动窗口的设置
在我查资料的时候没有找到相关的这一块,所以目前还是不太清楚这个滑动窗口是由什么来进行设置的,就先不写这些了,避免误人子弟
四、HTTP协议
超文本传输协议HTTP(HyperText Transfer Protocol)是一种无状态的,以请求/应答的方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动。
4.1、报文格式
- HTTP报文格式
- 请求行报文格式
请求方式:如GET、POST、HEAD、PUT等,表示对资源的操作
请求目标:通常是一个URI,标记了请求要操作的资源
版本号:报文使用的HTTP协议版本,1.1以后都会有
- 相应行报文格式
版本号:HTTP协议版本
状态码:三位数,表示对请求的处理结果,如200表示成功,500是服务器错误等
原因:数字状态码的补充,帮助用户了解因响应结果
- 头字段
使用key:value的形式,最后用CRLF表示结束,如"Content-type:application/json",HTTP头字段非常灵活,不仅仅可以使用已有的头字段,也可以进行自定义。
4.2、注意事项
- 字段名不区分大小写,可以使用连字符"-“但不允许出现下划线”_“和空格” “(有的服务器不会解析带”_"的头字段),字段名后面必须紧跟:,不能有空格,而:后面的字段值之前可以有空格
- 字段的顺序没有意义,可以任意排列而不影响语义
- 字段原则上不能重复,除非这个字段本身允许,例如"Set-Cookie"