一.OSI七层模型
- 应用层:应用层协议的定义是应用进程间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。
- 表示层:表示层的主要作用之一是为异种机通信提供一种公共语言,以便能进行互操作。这种类型的服务之所以需要,是因为不同的计算机体系结构使用的数据表示法不同。例如:IBM主机使用EBCDIC编码,而大部分PC机使用的是ASCII码。在在这种情况下,便需要表示层来完成这种转换。
- 会话层:会话层提供的服务可使应用建立和维持会话,并能使会话获得同步。会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信。这种能力对于传送大的文库极为重要。
- 传输层:传输层的主要任务就是 负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。
- 网络层:网络层的任务就是选择合适的网间路由和交换结点,确保计算机通信的数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送
- 数据链路层:两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层接下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息
- 物理层:物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。 在互联网使用的各种协议中最重要和最著名的就是 TCP/IP 两个协议。
问:http属于哪一层
答:应用层
二:传输层协议
TCP协议
传输控制协议(Transmission Control Protocol,简称 TCP)是一种 面向连接(连接导向)的、可靠的、 基于 IP 协议的传输层协议。
- 面向连接:每条 TCP 连接只能有两个端点(亦即点对点,不可广播、多播),每一条 TCP 连接只能是一对一
- 可靠的传输服务:通过 TCP 连接传送的数据,无差错、不丢失、不重复、并且按序到达,丢包时通过重传机制进而增加时延实现可靠性
- 全双工通信:TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据
- 字节流:面向字节流,TCP 中的 流(Stream)指的是流入进程或从进程流出的字节序列
- 流量缓冲:解决速度不匹配问题
三次握手,四次挥手 三次握手:TCP 提供 面向连接 的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作,也就是说无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接(确保双方都能正常收发信息)。
- 第一次握手:建立连接。客户端发送连接请求报文段,将标志比特位 SYN 置为 1,随机产生一个序列号码 Sequence Number 值为 X(由操作系统动态随机选取一个 32 位长的序列号),并将该数据包发送给服务端,客户端进入
SYN_SENT状态,等待服务端确认。 - 第二次握手:服务端收到 SYN 报文段。服务端收到数据包后需要对标志位 SYN 报文段进行确认,确认后设置确认号码 Acknowledgment Number 为 X+1(Sequence Number+1);同时,自己还要发送 SYN 请求信息(以建立服务端对客户端的连接),将 SYN 设置为 1,设置 Sequence Number 值为 Y(由操作系统动态随机选取一个 32 位长的序列号),服务端将上述所有信息放到一个报文段(即 SYN+ACK 报文段)中,一并发送给客户端以确认建立连接请求,服务端进入
SYN_RCVD状态。 - 第三次握手:客户端收到服务端的 SYN+ACK 报文段。确认后,然后将 Acknowledgment Number 设置为 Y+1,向服务端发送 ACK 报文段,这个报文段发送完毕后,客户端和服务器端进入 ESTABLISHED 状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
大白话版本(A:在吗?我要准备建立连接啦。你能看到我的消息吗? B:好的,我这边可看到你的消息,你可以看到我的消息吗? A:可以的。--到此确认双方都能正常通信)
问:第一次握手可以传输数据吗?
答:不可以。因为三次握手还没完成。
问:第三次握手可以传输数据吗?
答:可以。因为能够发出第三次握手报文的主机,肯定接收到第二次(来自服务端)的握手报文。因为伪造 IP 的主机不会收到第二次报文。
四次挥手:
- 第一次挥手:客户端设置 Sequence Number,发送一个
FIN报文段,用于关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说「我客户端没有数据要发给你了」,但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。 - 第二次挥手:服务器端收到
FIN报文段,回复ACK报文段,Acknowledgment Number 为 Sequence Number 加 1,告诉客户端,你的请求我收到了,我同意你的关闭请求。这个时候客户端就进入FIN_WAIT_2状态。 - 第三次挥手:当服务器端确定数据已发送完成,则向客户端发送
FIN报文段,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。 - 第四次挥手:客户端收到
FIN报文段后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ACK报文段回复服务端,然后进入TIME_WAIT状态,如果服务端端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了 2MSL(通常是两分钟)后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。
问:为什么需要四次挥手。
答:为了关闭双工。
UDP协议
用户数据报协议(User Datagram Protocol,UDP),又称使用者资料包协定,是一个简单的面向数据包的传输层协议,正式规范为 RFC 768。
在 TCP/IP 模型中,UDP 为网络层以上和应用层以下提供了一个简单的接口。UDP 只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以 UDP 有时候也被认为是不可靠的数据报协议)。UDP 在 IP 数据报的头部仅仅加入了复用和数据校验(字段)。
特点
- 无需建立连接(减少延迟)
- 尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态
- UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短
- 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如直播,实时视频会议等)
- 支持一对一、一对多、多对一和多对多的交互通信
数据通信形式
- 单工数据传输只支持数据在一个方向上传输
- 半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信
- 全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力
TCP 与 UDP
| TCP | UDP | |
|---|---|---|
| 连接性 | 面向连接 | 无连接 |
| 双工性 | 全双工(1:1) | n:m |
| 可靠性 | 可靠(重传机制) | 不可靠(丢包后数据丢失) |
| 有序性 | 有序(通过 SYN 排序) | 无序 |
| 有界性 | 无,有沾包情况 | 有消息边界,无沾包 |
| 拥塞控制 | 有 | 无 |
| 传输速度 | 慢 | 快 |
| 量级 | 低 | 20-60 字节 |
| 头部大小 | 高 | 8 字节 |