目录
一. 网络基础
1. IP地址
2. 端口号
3. 协议
4. OSI七层模型
二. UDP协议
2.1 UDP的协议端格式:
2.2 UDP的特点
三. TCP协议
3.1 TCP协议段格式
3.2 TCP原理
(1)确认应答机制
(2)超时重传机制
(3)三次握手,四次挥手
(4)滑动窗口
(5)流量控制
(6)拥塞控制
(7)延迟应答
四. TCP/UDP对比
一. 网络基础
1. IP地址
IP地址相信大家早已都耳熟能详了吧,但是对于初学网络的小伙伴来说,还是一个很懵懂的概念,没关系,本人也是刚对网络有了一个初步的了解,希望通过下面的学习总结,来帮助大家一起了解网络的一些基本原理;
概念:
IP地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。简单说,IP地址用于定位主机的网络地址;
举个例子:IP地址就相当与快递的收货地址虽然定位到了主机,但是IP地址还存在一个问题,就是我们要把数据传输到哪个进程接收,这就需要端口号了;
2. 端口号
概念:在网络通信中,IP地址用于标识主机网络地址,端口号可以标识主机中发送数据、接收数据的进程。简单说:端口号用于定位主机中的进程。
举个例子:上面说到IP地址是快递的收货地址,那么端口号就是指定的收货人,以确保传输的数据能准确的到达定点;
关于端口号的说明:
一个进程可以绑定多个端口号,多个进程不能绑定同一个端口号;一个进程启动后,系统会会随机分配一个端口;
3. 协议
概念:协议,网络协议的简称,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。
为什么需要协议呢?
简单点来说,就是一套标准,因为计算机的有不同操作系统,不同的版本,多家厂商生产出来的硬件有有所区别,为了让这些设备都能保持正常的通信,就约定了一个标准,这一套标准就叫协议;
常见的默认端口号:
- 22端口:预留给SSH服务器绑定SSH协议
- 21端口:预留给FTP服务器绑定FTP协议
- 23端口:预留给Telnet服务器绑定Telnet协议
- 80端口:预留给HTTP服务器绑定HTTP协议
- 443端口:预留给HTTPS服务器绑定HTTPS协议
4. OSI七层模型
OSI 是 Open System Interconnection 的缩写,译为“开放式系统互联”;OSI 模型把网络通信的工作分为 7 层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层;
OSI 只是存在于概念和理论上的一种模型,它的缺点是分层太多,增加了网络工作的复杂性,所以没有大规模应用。后来人们对 OSI 进行了简化,合并了一些层,最终只保留了 4 层,从下到上分别是接口层、网络层、传输层和应用层,这就是大名鼎鼎的 TCP/IP 模型;
就拿TCP/IP模型来说:
- 应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。
- 传输层:负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。
- 举个例子:传输层只关心两台主机通信的地址,比如我们网上购物,从北京到上海,我不关心中途是怎么运输的,我只关心起点和终点;
- 网络层:负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。
- 举个例子:还是拿购物一事来说,网络层关注的是路线怎么走,比如从北京到上海有很多条路可以走;
- 数据链路层:负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层。
- 举个例子:数据链路层关注的是路径之间的相邻节点该怎么走,比如就北京到上海,要路过多个城市,而这些多个城市之间的路线是数据链路层所关心的;
- 物理层:负责光/电信号的传递方式。比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层
注意:
- 必须是同一层次进行通信,比如,A 计算机的应用层和 B 计算机的传输层就不能通信,因为它们不在一个层次,数据的拆包会遇到问题。
- 每一层的功能都必须相同,也就是拥有完全相同的网络模型。如果网络模型都不同,那不就乱套了,谁都不认识谁。
- 数据只能逐层传输,不能跃层。
- 每一层可以使用下层提供的服务,并向上层提供服务。
二. UDP协议
UDP(User Datagram Protocol)是一个简单的面向消息的传输层协议;
2.1 UDP的协议端格式:
源端口: 数据从这里发出;
目的端口:数据要去的地方;
长度:标识UDP头的长度,包括首部长度和数据长度;一个UDP报文最大长度就是64KB;
校验和:它存在的意义就是用来判定一下,如果校验和出错,就会直接丢弃;
2.2 UDP的特点
(1)无连接
UDP传输的过程类似于寄信,知道对方的端口号和IP地址就可以进行传输,不需要建立连接
(2)不可靠
没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;
(3)面向数据报
应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并;
三. TCP协议
TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层协议。
3.1 TCP协议段格式
3.2 TCP原理
(1)确认应答机制
当发送端发送数据时,如上图,第一次发送数据时,数据包括一个报头和载荷,报头是序号,载荷里面是要发送的数据,当第一次发送时,接收方会接受应答,并返回确认序号向发送发索要下一次的数据,通过ack的确认序号,告诉发送方我已经接受到了哪些数据;
在进行确认应答时,往往会伴随着后发先至的情况,就是先发送的数据后到,后发的数据先到的情况,这种情况也不用担心,对于TCP来说,它会帮我们整队,在TCP内部有个接受缓存区,这是内核中的一块内存空间,当出现乱套的情况,TCP会在这个缓存区按照序号帮我们对收到的消息进行整队;
(2)超时重传机制
在网络的传输过程中,难免会发生"丢包"的情况,那么TCP就会采取重传机制,以便于发送的数据包能准确无误的到达目的地,在丢包中,一般分为两种情况:
1.第一次发送方的数据直接丢了,接收方没到到,不会发送ack;
2.接受方收到数据了,返回的ack丢了;
这种情况下,就有一个问题,当接受方返回的ack丢了之后,发送方会继续发送,这样接受方就一直收到重复的数据,这可不是一个小问题,就拿手机支付来说,本来要付1元,结果因为丢包接受方没有返回响应,就会一直扣款!!!
当然,TCP的功能是很强大的,这点问题TCP也会采取相应的措施来帮我们解决,TCP会在接收缓存区根据收到的数据的序号,来帮助我们去重,这样就保证读到的数据不会是重复的!!!
在重传的过程中,也有可能发生丢包,丢失的包继续发生重传,但是每丢包一次,超时等待的时间就会变长,TCP会认为重传也没戏了,于是就干脆放弃了(这种就是严重的网络问题),连续多次重传,都无法得到ack,此时TCP就会尝试重置连接,如果连接失败,TCP就会关闭连接,放弃网络通信了;
面试题:TCP是如何实现可靠性的?
答:确认应答+超时重传
这里不能回答三次握手和四次挥手,这个是和连接相关的,而非可靠性;
(3)三次握手,四次挥手
TCP建立连接:三次握手
所谓握手,就是通信双方,进行一次网络交互,相当于客户端和服务器之间,通过三次交互,建立了关系;
过程:
1、第一次握手:客户端给服务器发送一个 SYN(同步报文段) 报文。
2、第二次握手:服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。
3、第三次握手:客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文。
4、服务器收到 ACK 报文之后,三次握手建立完成。
三次握手的作用:
简单点来说,就是验证了客户端和服务器端各自的发送能力和接收能留是否正常;
注:三次握手都是由内核自动完成的,应用程序干预不了;
TCP断开连接: 四次挥手
过程:
1、第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态。
2、第二次握手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态。
3、第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
4、第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态
5、服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
在三次握手中,返回的ACK和SYN是合并发送到客户端的,而四次挥手这里的FIN和ACK是不能合并发送的,这是因为三次握手中的ACK和SYN是同一时机触发的,都是由内核完成的,而四次挥手中的ACK和FIN是不同时机触发的,ACK是在内核完成的,而FIN是由应用程序代码控制的,是在调用socket的close方法的时候才会触发FIN;
(4)滑动窗口
上面说到当发送方发送一个数据段,都要给一个ACK确认应答,收到ACK之后才会发送下一个数据段,如果我们要发送大量的数据段时,那么发送方这边就需要一条一条的等待ACK,这样就浪费了大量时间,所以为了缩短等待时间,这里就需要批量发送,以提高发送的效率;
批量传输之后:
上述批量传输数据的过程,我们就叫做滑动窗口,批量发送并不是无厘头的去发,而是发送到一定程度,就等待ACK,我们把批量发送等待的数据,称为"窗口大小";
(5)流量控制
上面说的滑动窗口,就是为了让传输的效率更高,窗口越大,批量发送的数据越多,整体的效率就提上去了,可是并不是越快越好,如果发送太快了,就很容易把接收缓冲区给塞满了,此时你再发送数据,就很容易丢包了,TCP也有这样的机制,通过流量的控制,来限制一下发送方的速度;
那么是如何进行控制的呢???
我们让ACK报文中携带一个"窗口大小"的字段,当ACK为1的时候,此时就是一个ACK报文,此时窗口大小字段就会生效,这里是拿接受缓冲区的剩余空间作为窗口大小;
当发送方发现对方满了之后,就会暂停发送,但是不会一直停止,每隔一段时间就会触发一个窗口探测报文,如果发现缓冲区有容量了,就会继续批量发送;
(6)拥塞控制
我们都知道,在客户端和服务器端之间往往都有很多的交换机和路由器,很明显,在传输路径上,中间任何一个设备出了问题,都会导致传输速率受到一定的影响;拥塞控制的作用就是衡量中间节点传输的能力;
拥塞控制是通过实验的方式,来找到一个合适的发送速率;开始的时候,按照一个小的速率发送,如果不丢包,就可以适当提高一下速率,如果丢包,就把速率调小;最后得到一个合适的发送速率,这实际上也是一个动态平衡的过程;
(7)延迟应答
上面说到接收方要返回ACK给发送方,这里的延迟应答就是不是立即发送ACK,而是等一会再发送,这样做的好处就是可以增大窗口的大小,因为延迟的这一小会儿,应用程序从接受缓存区里消费了一批数据了,同时也能让发送方的发送速率大一些;
TCP中延迟应答的两种方式:
- 数量限制:每隔N个包就应答一次;
- 时间限制:超过最大延迟时间就应答一次;
四. TCP/UDP对比
相同点:TCP和UDP都是网络层之上的,传输层协议,都能都能保护网络层的传输,双方的通信都需要开放端口,TCP和UDP中都存在复用和分用技术;
不同点:TCP是可靠传输的,UDP是不可靠传输的;
使用场景:
绝大部分场景下,都可以使用TCP,对于效率要求较高但对于可靠性要求不高的场景下,可以使用UDP,不过归根结底,还是要根据具体的需求去选择使用;