1. OSI分层
国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型。
OSI(Open System Interconnection)模型定制的七层标准模型分别是:
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
虽然国际化标准组织定制了这样一个网络协议的模型,但是实际上互联网通讯使用的网络协议时TCP/IP网络协议(Transmission Control Protocol)。TCP/IP是一个协议族,也是按照层次划分。共四层:
- 应用层
- 传输层
- 互联网络层
- 网络接口层
OSI网络协议模型,是一个参考模型,而TCP/IP协议是事实上的标准。TCP/IP中有两个重要的协 议,传输层的TCP协议和互连网络层的IP协议,因此就拿这两个协议做代表,来命名整个协议族了,在说TCP/IP协议时,是指整个协议族。
2.TCP和UDP的区别?
先说传输层,传输层有多个协议,但最主要的是TCP和UDP协议。两者两则的区别在于TCP协议需要接收方反馈,UDP协议不需要接收方反馈。因此,TCP传输比UDP传送更可靠,但是TCP传输的效率就不如UDP了。至于,在传送过程中具体选择哪种传送方式,需要具体问题具体分析。在不可靠的 网络传送过程中一般选择TCP传送方式。在讲求效率,或者不在乎传送失误的情况下可以选择UDP方式来提高传输速率。
TCP与UDP区别总结:
TCP和UDP都是传输层的两个协议,他们之间的一个区别主要从以下三个方面来提现:
- 连接性:TCP面向连接:需三次握手建立连接,四次挥手断开。UDP无连接:直接发送数据,无需建立连接。
- 可靠性: TCP可靠传输:通过序列号、确认应答、重传机制保证数据不丢失、不重复、按序到达。UDP不可靠传输:不保证数据到达、顺序和完整性,可能丢包或乱序。
- 传输效率:TCP效率低:需维护连接状态、重传机制、滑动窗口等,开销大,UDP效率高:无连接建立和维护开销,头部仅 8 字节。。
- 数据形式:TCP字节流:将应用层数据视为无结构的字节流,按序交付,UDP数据报:保留应用层数据的边界,一次发送一个完整报文。
- 拥塞控制:TCP支持:通过慢启动、拥塞避免、快速重传等算法动态调整发送速率,UDP不支持:应用需自行实现流量控制(如游戏中的丢包补偿)。
- 头部开销:TCP:20~60 字节(基础 20 字节,含序列号、确认号等字段),UDP:8 字节(固定,仅含源端口、目标端口、长度、校验和)。
- 有序性:TCP保证:通过序列号确保接收方按发送顺序重组数据,不保证:可能乱序,需应用层自行处理。
3、TCP/IP协议
http、tcp、ip都属于什么层呢?
- http协议对应于应用层
- tcp协议对应于传输层
- ip协议对应于网络层
三次握手:
所谓三次握手即建立TCP连接,就是指建立一个TCP连接时,需要客服端和服务端总共发送3个包已确认连接的建立。
(1)第一次握手:是客户端向服务器发起的,客户端将标志位SYN设置为1,所以这个包也叫做SYN包,随机产生一个seq=J,并将该数据包发送给服务端,客户端进入SYN_SENT状态,等待Server确认。
(2)第二次握手:是服务器向客户端发起的,收到数据包后由标志位SYN=1知道客户端请求建立连接,Server将标志位SYN位和ACK位都置为1,ack=J+1,随机产生一个seq=K,并将该数据包(SYN-ACK包)发送给客户端以确认连接请求,服务端进入SYN_RCVD状态。
(3)第三次握手:是客户端发给服务器的,客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包(ACK包)发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则建立成功,Client和Server进入已确立(ESTABLISHED)状态,完成三次握手,随后Client和Server之间可以开始传输数据了。
三次握手的核心目的:
TCP 是面向连接的可靠传输协议,握手的核心是让双方确认彼此的 “发送能力” 和 “接收能力” 均正常:
客户端→服务器:验证服务器的接收能力和发送能力(服务器能收到客户端消息,且能回复)。
服务器→客户端:验证客户端的接收能力(客户端能收到服务器的回复)。
第三次握手(客户端→服务器):让服务器确认客户端能收到自己的消息,从而放心开始传输数据。
为什么TCP的连接过程是3次握手而不是2次握手(服务端回复SYN+ACK包后就建立连接)/两次握手的缺陷?
答:
1.过期连接请求的干扰:假设客户端发送的第一个连接请求因网络延迟 “过期”,之后客户端又发送了一个新的请求并完成两次握手,建立了正常连接。
若此时 “过期” 的请求到达服务器,服务器会误认为是新请求,直接发送确认并建立连接。但客户端此时已忽略该过期请求,不会回应,导致服务器一直等待客户端数据,造成资源浪费(如端口占用)。
**2.无法确认客户端的接收能力:**两次握手仅能让客户端确认服务器能接收消息,但服务器无法确认客户端是否能接收自己的回复。若服务器直接开始发送数据,而客户端实际未收到确认(如网络故障),数据会丢失,违背 TCP 的可靠性原则。
一包数据可能采取拆成多包发送,如何处理丢包问题?这些数据包到达的顺序不同,如何处理乱序问题?
答:tcp协议为每一个连接建立了一个发送缓冲区,从建立连接后的第一个字节的序列号为0,后面每一个字节的序列号都会增加1,发送数据时从发送缓冲区取一部分数据组成发送报文,在其tcp协议头中会附带序列号和长度,接收端在收到数据后需要回复确认报文,确认报文中的ACK等于接收序列号加长度,也就是下一包数据需要发送的起始序列号,这样一问一答的放松方式能够使发送端确认发送的数据已经被对方收到,发送端也可以一次发送连续的多包数据,接收端只需要回复一次ACK就可以了,这样发送端可以把待发送的数据分割成一系列的碎片发送到对端。对端根据序列号和长度在接收后重构出来完整的数据,假设其中丢失了某些包数据,在接收端可以要求发送端重传。
四次挥手:
所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
(1)第一次挥手:客户端发送一个FIN包,用来关闭客户端和服务器的数据传送,客户端进入FIN_WAIT_1状态。
(2)第二次挥手:服务端收到FIN包后,发送一个ACK包给客户端,服务端进入CLOSE_WAIT状态。
(3)第三次挥手:服务端发送一个FIN包,用来关闭服务端到客服端的数据传送,服务端进入LAST_ACK状态。
(4)第四次挥手:客户端收到FIN包,客户端进入TIME_WAIT状态,接着发送一个ACK包给服务端,服务端进入关闭状态,完成四次挥手。
4、SOCKET连接与HTTP连接
通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
5.SOCKET连接与TCP/IP连接
创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,才能使用TCP/IP协议。
总结:
1.HTTP是应用层协议,定义的是传输数据的内容以及格式的规范。
2.TCP是底层通讯协议,定义的是数据传输和连接方式的规范。
3.Socket可以支持不同的传输层协议(TCP/UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接,Socket是发动机,提供了网络通信的能力
6.什么是单工、半双工、全双工通信?
单工:信息只能单向传送
半双工:信息能双向传送但不能同时双向传送;
全双工:信息能够同时双向传送。
7.WebSocket与Socket的关系
总结:Socket和WebSocket在运行方式、实现机制和应用场景等方面存在较大差异,它们各自适用于不同的场景和需求。
Socket其实并不是一个协议,而是为了方便使用TCP/UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。当两台主机通信时,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接。TCP连接则更依靠于底层的IP协议,IP协议的连接则依赖于链路层等更低层次。
WebSocket就像HTTP一样,是一个典型的应用层协议。
总结:
Socket是传输控制层接口,WebSocket是应用层协议。
两者区别:
- 协议层次不同
Socket不是一种具体的协议,而是位于应用层和传输控制层之间的一组接口,用于实现不同计算机之间的数据传输,其提供了一套调用TCP/IP协议的API,隐藏了复杂的TCP/IP协议族,使得用户可以通过简单的接口进行通信。而WebSocket是一项HTML5技术规范,是一种应用层协议,它定义了WebSockets API,支持页面使用WebSocket协议与远程主机进行全双工通信。 - 运行方式不同
Socket在服务器创建后监听端口和IP地址,等待客户端的请求并建立连接后才能进行数据传输。而WebSocket由浏览器发起,在收到响应后保持长连接,使服务器可以主动向客户端推送信息。 - 实现机制不同
Socket接口不依赖于任何协议、格式或地址,是一种独立的抽象接口。而WebSocket基于HTTP协议,通过在建立连接时升级为WebSocket协议来实现全双工通信。 - 应用场景不同
Socket主要应用于服务器之间的通信以及大吞吐量的数据交换场景,如消息队列和数据同步。而WebSocket适合处理实时性要求较高且频率较高的数据传输,如在线游戏、视频直播、通知提醒等。
8.WebSocket与HTTP的关系
WebSocket是HTML5规范提出的一种协议。HTML5 Web Sockets规范定义了Web Sockets API,支持页面使用Web Socket协议与远程主机进行全双工的通信。它引入了WebSocket接口并且定义了一个全双工的通信通道,通过一个单一的套接字在Web上进行操作。
相同点:
1.都是一样基于TCP的,都是可靠性传输协议。
2.都是应用层协议。
不同点:
1.WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息。HTTP是单向的。
2.WebSocket是需要浏览器和服务器握手进行建立连接的。而http是浏览器发起向服务器的连接,服务器预先并不知道这个连接。
联系:
WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的。
WebSocket连接的过程:
1.客户端发起http请求,经过3次握手后,建立起TCP连接;http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;
2.服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据;
3.客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信。
总结:
在WebSocket中,只需要服务器和浏览器通过HTTP协议进行一个握手的动作,然后单独建立一条TCP通信通道进行数据传送。