OSI参考模型主要由七层架构组成,分别是:
物理层: 主要包括一些物理标准设备
,如网线接口类型、光纤接口类型、各种传输介质速率等。主要作用是传输比特流
。这一层的数据叫做比特
数据链路层: 主要从物理层接受的数据进行MAC地址(网卡地址)
的封装与解封。这一层的设备叫交换机
,数据通过交换机
来传输。
网络层: 下层接收到的数据进行IP地址的封装与解封装
。这一层工作得设备是路由器
,这一层的数据叫数据包
传输层: 定义了一些传输数据的协议和端口号
,如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。
。主要是将下层数据进行分段传输,到达目的地后进行重组。这一层的数据叫段
。
会话层: 通过传输层
建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求。
表示层: 主要对接收到的数据进行解释、加密和解密、压缩与解压缩
。
应用层: 主要是一些终端的应用
,如FTP,WEB,QQ之类的。
TCP/IP四层模型分别是:
应用层: 参考于OSI参考模型的高层,为用户提供所需要的各种服务,如FTP、Tenlnet、DNS、SMTP
等。
传输层: 对应与OSI参考模型的传输层,为应用层提供端到端的通讯功能,保证了数据包的顺序传送和数据的完整性。主要定义了TCP
和UDP
协议。
网络层: 网际互联层对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。该层协议有IP协议、地址解析协议(ARP)、互联网管理协议(IGMP)和互联网控制报文协议(ICMP)。
IP协议是网际互联层最重要的协议,它提供的是一个不可靠、无连接的数据报传递服务。
网络接口层: 网络接入层与OSI参考模型中的物理层和数据链路层相对应。它负责监视数据在主机和网络之间的交换。
OSI七层网络模型 |
TCP/IP四层概念模型 |
对应网络协议 |
应用层(Application) |
应用层 |
HTTP、TFTP, FTP, NFS, WAIS、SMTP |
表示层(Presentation) |
Telnet, Rlogin, SNMP, Gopher |
|
会话层(Session) |
SMTP, DNS |
|
传输层(Transport) |
传输层 |
TCP, UDP |
网络层(Network) |
网络层 |
IP, ICMP, ARP, RARP, AKP, UUCP |
数据链路层(Data Link) |
网络接口层 |
FDDI, Ethernet, Arpanet, PDN, SLIP, PPP |
物理层(Physical) |
IEEE 802.1A, IEEE 802.2到IEEE 802.11 |
优点:
TCP在真正的读写操作之前,server和client必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接。连接的建立通过三次握手,释放需要四次挥手。所以说每建立一个连接都是需要消耗资源和时间的。
TCP短链接
短链接步骤:client向server发送连接请求 -> server接到请求 -> client向server发送消息 -> server回应client -> 一次读写完成,一般由client发起close操作。
短连接之间一般只会在client/server之间传递一次读写操作。
TCP长链接
长链接步骤:client向server发送连接请求 -> server接到请求 -> client向server发送消息 -> server回应client -> 一次读写完成,连接不关闭 -> 后续读写操作 -> 一般由client发起close操作
。
各自优缺点以及应用场景
长连接适用场景:监控系统、即时通讯系统、数据库连接
短链接使用场景:Http服务
序列号SEQ
:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
确认序号 ack
:占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
确认标志位ACK
:占1位,确认序号有效。
同步SYN
:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
终止FIN
:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接
第一次握手: 客户端发送第一个包,其中SYN标志位为1, ACK=0,发送顺序号sequence=X(随机int)。客户端进入SYN发送状态,等待服务器确认。
第二次握手: 服务器收到这个包后发送第二个包,其中包SYN、ACK标志位为x+1,发送顺序号seq=Y(随机int),接收顺序号ACK=X+1,此时服务器进入SYN接收状态。
第三次握手: 客户端收到服务器传来的包后,向服务器发送第三个包,SYN=0, ACK=Y+1,接收顺序号ACK = Y+1,发送顺序号seq=X+1。此包发送完毕,客户端和服务器进入ESTABLISHED建立成功状态,完成三次握手。
问题:为什么不能用两次握手进行连接?
答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
问题:如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
四次挥手是指终止TCP连接协议时,需要在客户端和服务器之间发送四个包
第一次挥手: 主动关闭方发送第一个包,其中FIN
标志位为1,发送顺序号seq
为X,ACK为Z。
第二次挥手: 被动关闭方收到FIN包后发送第二个包,其中发送顺序号seq
为Z,接收顺序号ack
为X+1。
第三次挥手: 被动关闭方再发送第三个包,其中FIN标志位为1,发送顺序号seq
为Y,接收顺序号ack
为X。
第四次挥手: 主动关闭方发送第四个包,其中发送顺序号seq
为X,接收顺序号ack
为Y + 1。至此,完成四次挥手。
超时重传指的是,发送数据包在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送。这个等待时间被称为RTO.
问题:为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
建立连接时,ACK和SYN可以放在一个报文里来发送。而关闭连接时,被动关闭方可能还需要发送一些数据后,再发送FIN报文表示同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
两个存在的理由:1、无法保证最后发送的ACK报文会一定被对方收到,所以需要重发可能丢失的ACK报文。2、关闭链接一段时间后可能会在相同的IP地址和端口建立新的连接,为了防止旧连接的重复分组在新连接已经终止后再现。2MSL足以让分组最多存活msl秒被丢弃。
窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方何有一个窗口,接收方通过TCP报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。
发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接受。如果发送窗口左部的字节已经发送并且收到了确认,那么将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接受窗口的滑动类似,接受窗口左部字节已经发送确认并交付主机,就向滑动接受窗口。
UDP又称无连接协议, 主要用于如下:
特征点 | TCP | UDP |
---|---|---|
是否连接 | 面向连接 | 非连接 |
传输可靠性 | 可靠 | 会丢包,不可靠 |
应用场景 | 传输数据量大 | 传输量小 |
速度 | 慢 | 快 |