1 前言
计算机网络是指将位于不同地理位置,但具有独立功能的多台设备,通过通信设备和线路连接起来,在网络操作系统,网络管理软件、网络通信协议的协调管理下,实现资源共享和信息传递的计算机系统。
简单来说,计算机网络就是用于满足不同机器之间通信、共享的一种系统。
1.1 计算机网络的组成
从组成上而言,计算机网络主要由主机、协议、传输介质以及软件四部分组成。
主机:可以是手机、电脑、服务器、电子手表等任意计算机硬件。
协议:各类定义归法的网络通信协议,如TCP/IP、IPX/SPX、AppleTalk等。
传输介质:传输数据的通道,可以是实体铜线、电缆、光纤,也可以是无形的电磁波空间介质。
软件:涵盖所有联网的应用,如QQ、微信、支付宝、淘宝、京东等各类软件。
1.2计算机网络的功能组成
计算机网络体系的两个核心功能
资源共享:资源子网实现-->OSI中的上三层
数据通信:通信子网实现-->OSI中的下三层
1.3 网络分层与OSI七层模型
而在计算机网络中,当两台机器进行通信时,其过程主要包含数据的封装与解封:
如上图,左侧是发送端,右侧是接收端,当发送端的应用尝试传输一条数据时,数据会根据网络分层结构,从上至下依次封装,每层都对数据做一定的处理,最后在物理层转换为比特流(二进制数据),然后传输至接收端。因为双方之间遵守的都是相同的协议体系(网络模型),因此接收端会首先接收到比特流数据,然后从下至上依次解封数据,最终在应用层还原数据,从而达到通信的目的。
2 通信协议的基本概念
2.1 协议数据单元(PDU)
计算机网络体系中,不同节点通信时交换的信息报文称PDU=协议头信息 + 数据
2.2 TCP/IP体系中数据的通信过程
TCP/IP体系中,一端要想为另一端发送信息数据也会经历封装与解封过程,每一次封装都会形成本层的PDU.
同比生活,也就是类似收发快递的过程:
发件:[发件人]→[货物]→[驿站]→[快递公司站点]
传输介质:[运输路线]→[中转站]
收件:[快递公司站点]→[驿站]→[货物]→[收件人]
3 TCP/IP协议简介
源端口/目的端口:指数据发送方的应用进程端口号和接收方的端口号
序号:TCP为了保证数据的可靠传输,会对分段数据标注序号用于组装和确定数据的正确性
确认序号:当接收方收到接收到本次数据时,下次需要发送的数据段序号。
首部:表示TCP报文头的长度,因为TCP头长度可变性,因此需要在头信息中声明每个头的长度
保留位:预留一些空间给未来拓展时使用。
URG:表示本次发送的报文数据中是否是紧急数据。
ACK:确认信号,当报文中ACK=1的时候表示正确或同意。
PSH:表示接收方应该尽快将这个报文交给应用层,为后续数据腾出空间,不要停留在缓冲区。
RST:如果收到RST=1的报文,说明与主机的连接出现严重错误(如主机崩溃),必须释放连接,然后重新建立连接。
SYN:建立一个新连接,SYN=1表示这是一个请求建立连接的报文段。
FIN:断开一个连接,FIN=1表示通知告知对方本段要关闭连接了。
3.1连接管理机制 - 三次握手与四次挥手
TCP的三次握手
所谓的TCP三次握手,其实是指TCP建立连接的过程,因为TCP属于可靠性的传输协议,因此在发送数据前必须要先确保发送/接收数据的双方状态正常,因此需要经过“三次握手”的过程,具体如下:
客户端向服务端发送建立连接的数据包SYN=1,seq=x,然后进入syn-send等待确认连接状态
SYN=1:代表请求建立连接。
seq=x:当前数据包的序号。
服务端接收到请求建立连接的数据包后,允许建立连接的情况下,会返回响应报文
SYN=1,ACK=1,seq=y,ack=x+1
SYN=1:TCP是双全工协议,因此服务端也需向客户端发送SYN=1信号。
ACK=1:确认客户端建立连接的请求。
seq=y:表示当前服务端返回给客户端的序号。
ack=x+1:确认客户端序号x之前的请求都已收到。
因为是双全工协议,连接是双向的,因此客户端也需确认一下服务端的连接请求,收到服务端的SYN=1后,也需返回ACK=1,seq=x+1,ack=y+1的数据包。
ACK=1:表示确认服务端的连接建立请求。
seq=x+1:当前数据包的请求序号。
ack=y+1:确认服务端序号y之前的数据都已成功接收。
经过如上三个步骤,客户端和服务端双方之间确认请求后,连接会成功建立,紧接着双方都会处于estab-lishen状态,数据可以正常传输。
TCP的四次挥手
当一方数据传输完成后,会尝试中断连接,因此又会经历“四次挥手”的过程,如下:
①客户端完成数据传输后,会发出FIN=1,seq=u关闭连接的报文,然后等待服务端响应。
FIN=1:代表请求关闭连接。
seq=u:请求序号。
②服务端收到客户端的“关闭”请求后,会给客户端返回确认关闭的报文:ACK=1,seq=v,ack=u+1。
ACK=1:确认客户端“关闭连接”的请求。
seq=v:请求序号。
ack=u+1:确认客户端序号u及其以前的数据都已成功接收。
客户端传输完成数据后,会告诉服务端自己要关闭连接了;
但服务端可能数据还未传输完成,因此会继续传输自己的数据,直至自身的数据也传输完成后,也会告诉客户端:自己也要关闭连接了。
③服务端传输完成自己的数据后,向客户端发送关闭连接的报文:FIN=1,ACK=1,seq=w,ack=u+1。
FIN=1:表示自己也要“关闭连接”了。
ACK=1:确认收到了之前的数据。
seq=w:请求序号。
ack=u+1:确认客户端序号u之前的数据都已成功接收。
④客户端接收到服务端“关闭连接”的请求后,给服务端响应确认报文:ACK=1,seq=u+1,ack=w+1。
ACK=1:确认服务端“关闭连接”的请求。
seq=u+1:请求序号。
ack=w+1:确认服务端序号w之前的数据都已成功接收。
前面提及过,因为TCP是双全工的协议,因此双方都可以主动释放连接,在TCP中,当一方数据传输完成后,就会主动关闭连接,也就会经历“挥手”的过程,同样我们也可以举个通俗一些的例子来认识这个过程:
①特种兵-竹子:竹子汇报完毕,请指示!
②指挥部-熊猫:指挥部收到!..&*/?..!^...继续说完自己要交代的任务。
③指挥部-熊猫:这里是熊猫,任务已指示完毕!
④特种兵-竹子:竹子收到!
中断通话.........
总结:
三次握手是指TCP建立连接需要发送三个数据包,主要目的是在于:为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。
四次挥手是指TCP关闭连接时需要发送四个数据包,主要目的在于:当客户端发送完数据后,给服务端发送“我要关闭连接了”的请求,然后服务端告知客户端收到了“关闭请求”,但此时服务端会继续向客户端传输未发送的数据,客户端也照旧可以接收服务端的数据,直到服务端的数据传输完成后,服务端也会发出“关闭连接”的请求,客户端同意后,最终才会断开连接,从而保证数据正常可靠的交互。
TCP中的沾包问题
首先要理解TCP传输数据的方式,TCP传输数据时会给每个文段分配一个序号,接收方接收数据之后会根据序号进行排序,然后将其放置在TCP缓存区中
黏包问题:多个数据包杂糅在一块,无法确定每一个数据包之间的分界。好像多个包粘在了一起。
发送方黏包问题:
TCP为了优化传输速度,将多个包进行打包传输。
当需要发送的数据大于MSS规定的数据,需要对数据进行拆分也会产生黏包问题。
接收方黏包问题:
TCP中,如果数据被接收后,应用程序没有及时处理也会出现黏包问题。
解决方案:
当使用TCP短连接时,不必考虑沾包问题。
当发送无结构数据,如文件传输时,也不需要考虑沾包问题,因为这类数据只管发送和接收保存即可。
如果使用长连接,那么则需要考虑沾包问题:
如果发送的报文都是相同的结构,那么可以在首部中添加数据长度,接收方根据首部中记录的数据大小读取数据。
将每个数据包封装成固定长度,不够的用0补齐,接收方每次按照固定大小读取数据即可。(效率低)
在数据之间设置边界,比如添加特殊符号,这样接收方收到数据时,根据特殊符号分割数据即可。
学习链接: https://juejin.cn/post/7101917676162777119