目录
一、TCP/IP网络模型
计算机与网络设备要互相通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要实现确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议。
OSI七层模型 | TCP/IP概念层模型 | 功能 | TCP/IP协议族 |
---|---|---|---|
应用层 | 应用层 | 文件传输,电子邮件,文件服务,虚拟终端 | TFTP,HTTP,SNNP,FTP,SMTP,Telnet |
表示层 | 数据格式化,代码转换,数据加密 | 没有协议 | |
会话层 | 解除或建立与别的接点的练习 | 没有协议 | |
传输层 | 传输层 | 提供端对端的接口 | TCP,UDP |
网络层 | 网络层 | 为数据包选择路由 | IP, ICMP, RIP, OSPF, BGP, IGMP |
数据链路层 | 链路层 | 传输有地址的帧以及错误检测功能 | SLIP, CSLIP, PPP, ARP, RARP, MTU |
物理层 | 物理层 | 以二进制数据形式在物理媒体上传输数据 | ISO2110, IEEE802, IEEE802.2 |
二、UDP协议
UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
应用场景:UDP即时通信类的(QQ、微信、飞秋)
UDP协议特点
- 面向无连接:UDP不需要和TCP一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了。并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。
- 有单播, 多播,广播的功能:UDP不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式。
- UDP是面向报文的:发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文。
- 不可靠性
- 首先不可靠性体现在无连接上,通信都不需要建立连接,想发就发,这样的情况肯定不可靠。
- 并且受到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。
- 在网络调节不好的情况下回导致丢包,优点是在某些实时性要求高的场景(比如电话会议)就需要使用UDP而不是TCP。
- 头部开销小,传输数据报文时很高效
三、TCP协议
TCP协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。
应用场景:文件的上传下载(发送邮件、网盘、缓存电影)
1、TCP连接过程
如下图所示,可以看到建立一个TCP连接的过程(三次握手):
第一次握手:客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯出事需要。请求发送后,客户端变进入SYN-SENT状态。
第二次握手:服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入SYN-RECEIVED状态。
第三次握手:当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接建立成功。
2、TCP断开链接
第一次挥手:若客户端A认为数据发送完成,则它需要向服务端B发送连接释放请求。
第二次挥手:B收到连接释放请求后会告诉应用层要释放TCP链接。然后会发送ACK包,并进入CLOSE_WAIT状态,此时表明A到B的连接已经释放,不再接收A发的数据了。但是因为TCP连接是双向的,所以B仍旧可以发送数据给A。
第三次挥手:B如果此时还没有发完的数据会继续发送,完毕后会向A发送连接释放请求,然后B变进入LAST-ACK状态。
第四次挥手:A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃)时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态。当B收到确认应答后,便也进入CLOSED状态。
第四次挥手为什么要等待2MSL?
- 防止客户端最后一个发给服务器的确认在网络中丢失以至于客户端关闭,而服务端并未关闭,导致资源的浪费
- 等待最大的2MSL可以让本次连接的所有的网络包在链路上消失,以防造成不必要的干扰。
3、长连接和短连接
3.1 长连接
长连接:指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持(不发生RST包和四次挥手)。
连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接(一个TCP连接通道多个读写通信);
这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态;
TCP保活功能:保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。如果客户已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将应远等待客户端的数据,保活功能就是试图在服务器端检测到这种半开放的连接。
如果一个给定的连接在两个小时内没有任何的动作,则服务器就向客户发一个探测报文段,客户主机必须处于以下4个状态之一:
- 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。
- 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
- 客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
- 客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应。
3.2 短连接
短连接:指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接(管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段)
连接→数据传输→关闭连接;
3.3 应用场景
长连接多用于操作频繁(读写),点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话,那么处理速度会降低很多,所以每个操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket创建也是对资源的浪费。
而像WEB网站的http服务一般都用短连接(http1.0只支持短连接,1.1keep alive 带时间,操作次数限制的长连接),因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁发长千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知。所以并发量大,但每个用户无需频繁操作情况下用短连接好
在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。
4、TCP协议的特点
- 面向连接:是指发送数据之前必须在两端建立连接。建立连接的方法是“三次握手”,这样能建立可靠的链接。建立连接,视为数据的可靠传输打下了基础。
- 仅支持单播传播:每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式。
- 面向字节流:TCP不像UDP一样那样一个个报文独立地传输,而是在不保留报文边界的情况下以字节流方式进行传播。
- 可靠传输:对于可靠传输,判断丢包、误码靠的是TCP的段编号以及确认号。TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接受。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。
- 提供拥塞控制:当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞。
- TCP提供全双工通信:TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来临时存放双向通信的数据。当然,TCP可以立即发送一个数据段,也可以缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于MSS)
四、TCP和UDP比较
1、对比
UDP | TCP | |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输 | 可靠传输,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一、一对多、多对一和多对多交互通信 | 只能是一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
使用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |
2、总结
TCP:面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次挥手断开连接
- 优点:在数据传输时,有确认、窗口、重传、拥塞控制机制,能保证数据正确性,较为可靠
- 缺点:速度相对慢一点,要求系统资源较多
UDP:面向无连接的通信协议,数据包括目的端口信息和源端口信息
- 优点:面向无连接,操作简单,要求系统资源较少,速度快,由于不需要连接,可进行广播发送
- 缺点:发送数据之前不需要与对方建立连接,接收到数据时也不需要发送确认信号,发送端不知道接收端是否正确接接收,不会重发,不可靠。