计算机网络分层结构:
- 7层OSI参考模型(法定标准)
- 4层TCP/IP参考模型(事实标准)
标准化工作
计算机网络的标准化工作之标准的分类:
- 法定标准:由权威机构制定的正式的、合法的标准:OSI
- 事实标准:某些公司的产品在竞争中占据了主流,时间长了这些产品中的协议和技术就成了标准:TCP/IP
OSI参考模型(法定标准)
OSI七层模型,由ISO(国际标准化组织)指定制定的一个国际标准OSI(Open System Interconnect 开放式通信系统互联参考模型)。常用来分析和设计网络体系结构。
TCP/IP参考模型(事实标准)
ISO/OSI参考模型 | TCP/IP参考模型 | |
---|---|---|
网络层 | 无连接+面向连接 | 无连接 |
传输层 | 面向连接 | 无连接+面向连接 |
面向连接 分为三个阶段,第一是建立连接,在此阶段,发出一个建立连接的请求。只有在连接成功建立之后,才能开始数据传输,这是第二阶段。接着,当数据传输完毕,必须释放连接。
面向无连接 没有这么多阶段,直接进行数据传输。
5层参考模型
综合OSI和TCP/IP的优点
传输层
传输层的功能:
- 传输层提供 进程和进程 之间的逻辑通信。网络层提供 主机之间 的逻辑通信;
- 复用和分用;
- 复用:应用层所有的应用进程都可以通过传输层再传输到网络层;
- 分用:传输层从网络层收到数据后交付指明的应用进程;
- 传输层对收到对报文进行差错检测;
传输层的两个协议
TCP
面向连接的传输控制协议TCP。传送数据之前必须建立连接,数据传送结束后要释放连接。不提供广播或多播服务。
由于TCP要提供可靠的面向连接的传输服务,因此不可避免增加了许多开销:确认、流量控制、计时器及连接管理等。
特点:可靠,面向连接,时延大,适应于大文件
- TCP是面向连接的传输层协议;
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的;
- TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达(可靠有序,不丢不重);
- TCP提供全双工通信,即发送方和接收方可以同时发送和接收;
发送缓存:准备发送的数据&已发送但尚未收到确认的数据
接收缓存:按序到达但尚未被接受应用程序读取的数据&不按序达到的数据
- TCP面向字节流,TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流;
UDP
无连接的用户数据报协议UDP。传送数据之前不需要建立连接,收到UDP报文后也不需要给出任何确认。
特点:不可靠,无连接,时延小,适用于小文件
- UDP是无连接的,减少开销和发送数据之前的时延;
- UDP使用最大努力交付,即不保证可靠交付;
- UDP是面向报文的,即应用层给UDP多长的报文,UDP就照样发送,即一次发一个完整报文,适合一次性传输少量数据的网络应用;
- UDP无拥塞控制,适合很多实时应用;
- UDP首部开销小,8B,TCP是20B;
TCP
TCP报文段首部格式
- 序号:在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的 第一个字节的序号 。
- 确认号:期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已正确收到。
- 数据偏移(首部长度):TCP报文段的数据起始处距离TCP报文段的起始处有多远,以4B位单位,即1个数值是4B。
6个控制位: - 紧急位URG:URG=1时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。
- 确认位ACK:ACK=1时确认号有效,在连接建立后所有传送的报文段都必须把ACK置为1;
- 推送位PSH:PSH=1时,接收方尽快交付应用程序,不再等到缓存填满再向上交付;
- 复位RST:RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立传输链接;
- 同步位SYN:SYN=1时,表明是一个连接请求/连接接受报文;
- 终止位FIN:FIN=1时,表明此报文段发送方数据已发完,要求释放连接。
- 窗口:指发送本报文段的一方的接收窗口,即现在允许对方发送的数据量;
- 检验和:检验首部+数据,检验时要加上12B伪首部,第四个字段为6;
- 紧急指针:URG=1时才有意义,指出本报文段中紧急数据的字节数;
- 选项:最大报文段长度MSS、窗口扩大、时间戳、选择确认...
TCP连接建立(三次握手)
TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器。
- 客户端发送 连接请求报文段,无应用层数据 SYN=1(连接请求报文),序号位seq=x(随机)
- 服务端为该TCP连接 分配缓存和变量,并向客户端返回 确认报文段,允许连接,无应用层数据 SYN=1(连接接收报文),ACK=1,seq=y(随机),确认号ack=x+1
- 客户端为该TCP连接 分配缓存和变量,并向服务器返回确认的确认,可以携带数据 SYN=0,ACK=1,seq=x+1,ack=y+1
SYN洪泛攻击
SYN洪泛攻击发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器资源。
攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。
解决方案:设置SYN cookie
为什么TCP一定要握手三次?
通过三次握手,客户端经历了一次请求和一次响应,服务端也经历了一次请求和一次响应,这时一方面确认了当前网络状态不错,另一方面又确认了自己这个沟通对象既能请求又能响应、确实没毛病。只有在这样安全、稳定的前提下,两台计算机之间才可以建立起 TCP 连接。三次握手的目的是为让双方验证各自的接收能力和发送能力,确保双方能够确实建立起稳定的传输通道。
TCP连接释放(四次挥手)
- 客户端发送 连接释放报文段,停止发送数据,主动关闭TCP连接 FIN=1,seq=u
- 服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了--半关闭状态 ACK=1,seq=v,ack=u+1
- 服务端发完数据,就发出连接释放报文段,主动关闭TCP连接 FIN=1,ACK=1,seq=w,ack=u+1
- 客户端回送一个确认报文段,再等到时间等待计时器设置的2MS(最长报文段寿命)后,连接彻底关闭 ACK=1,seq=u+1,ack=w+1
为什么TCP分手一定要挥手四次?
TCP连接是全双工协议,就是说双方都可以同时向对方发送或接收数据。
当客户端在想要断开连接时,只能确认自己没有数据要传输给服务器了,但并不能确认服务器是否还有数据要发送。
分手嘛,是两个人的事情。客户端不会因为自己没话说了就直接终止关系,而是会等服务器把话说完再走。因此,即便客户端抛出了分手请求,这时服务器还是可以传输数据过来的。
前两次挥手,只是对分手这件事做确认,但并不会立即行分手之时。
第三次挥手前,服务器会把自己想说的话说完,然后再通知一次客户端。这时,双方才真正都为分开做好了准备。
第四次挥手,客户端接收到了来自服务端的分手请求,响应“接受”的信号,才最后给这一段关系画上了句号。