Please enable JavaScript.
Coggle requires JavaScript to display documents.
Java网络编程之NIO (UDP编程 (UDP协议的报文结构), 网路模型 (OSI模型 (什么是OSI模型 (包括:物理层+数据链路层+网络层+…
Java网络编程之NIO
-
网路模型
TCP/IP模型
什么是TCP/IP模型
包括:网络接口层+互联网层+传输层+应用层
详细介绍
互联网层
互联网层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。互联网层除了需要完成路由的功能外,也可以完成将不同类型的网络(异构网)互连的任务。除此之外,互联网层还需要完成拥塞控制的功能。
传输层
传输层也就是TCP层,它负责在应用进程之间建立端到端的连接和可靠通信,它只存在与端节点中。TCP层涉及到两个协议,TCP和UDP协议。其中TCP协议提供面向连接的服务,提供按字节流的有序、可靠传输,可实现连接管理、差错控制、流量控制和拥塞控制等。UDP协议提供无连接的服务,用于不需要或无法实现面向连接的网路应用中。
TCP三次握手过程
第一次握手:客户端向服务端发送请求报文段。该报文段的头部中SYN(同步)=1,ACk(确认)=0,seq=x。(SYN=1,ACK=0表示该报文段为连接请求报文。x是本次TCP通信的字节流的初始序号,TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号。)
第二次握手:服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN(同步)=1,ACK(确认)=1,seq=y,ack=x+1。该应答发送完成后便进入SYN-RCVD状态。(PS1:SYN=1.ACK=1表示该报文段为连接同意的应答报文。PS2 :seq=y表示服务端作为发送者时,发送字节流的初始序号。PS3:ack=x+1表示服务端希望下一个数据报发送序号从x+1开始的字节。)
第三次握手:当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意已经成功收到。该报文段的头部为:ACK=1(确认),seq=x+1,ack=y+1。客户端发送完这个报文后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!
注意:通过上面的介绍,那么为什么连接建立需要三次握手而不是两次呢?答:防止失效的连接请求报文段被服务端接收,从而产生错误。
PS:失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是“失效”的。
若建立连接只需要两次握手,客户端并没有太大的变化,仍需要获取服务端的应答后进入ESTABLISHED状态,而服务端收到连接请求后进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样会浪费服务端资源。
TCP四次挥手过程
三次握手是建’立连接的,而四次挥手是释放连接的
1.第一次挥手:若A认为数据发送完成,则它需要向B发送释放连接的请求。该请求只有报文头,头中携带的主要参数为:FIN(终止)=1,seq=u。此时A将进入FIN-WAIT-1状态。(PS1:FIN=1表示该报文段是一个连接释放请求。PS2 :seq=u,u-1是A向B发送的最后一个字节的序号。)
2.第二次挥手:B收到连接释放请求后,会通知相应的应用程序,告诉它A向B这个方向的连接已经释放。此时B进入CLOSE-WAIT状态,并向A发送连接释放的应答,其报文头包括:ACK(确认)=1,seq=v,ack=u+1.(PS1:ACK=1:除了TCP连接请求报文段以外,TCP通信过程中所有数据报的ACK都为1,表示应答,PS2 :swq=v,v-1是B向A发送的最后一个字节的序号,PS3:ack=u+1表示希望收到从第u+1个字节开始的报文段,并且已经成功接收了前u个字节)。A收到该应答,进入FIN-WAIT-2状态,等待B发送连接释放请求。第二次挥手完后后,A到B的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A方向的连接仍然存在,B可以继续向A发送数据。
3.第三次挥手:当B向A发完所有数据后,向A发送连接释放请求,请求头:FIN(终止)=1,ACK(确认)=1,swq=w,ack=u+1.B便进入LAST-ACK状态
4.第四次挥手:A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB(传输控制块)。
注意:为什么A要先进入TIME-WAIT状态,等待2MSL时间后进入CLOSED状态?为了保证B能收到Ade确认应答。若A发完确认应答后直接进入CLOSED状态,那么如果应答丢失,B等待超时就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。
TCP 协议的报文结构
TCP报文段包括协议首部和数据两部分,协议首部的国定部分是20个字节(前面说了TCP是面向字节流的),首部的固定部分后面是选项部分(但是选项部分最多40字节,所以TCP报文首部在20-60字节之间)。数据部分不确定,根据实际数据来确定
1.源端口和目的端口:传输层和网络层一大重要区别就是传输层指定了数据报发送的应用进程,因此需要指出具体的端口号标志。
2.序号:当前TCP数据报数据部分的第一个字节的序号。我们知道,TCP是面向字节的,它会对发送的每一个字节进行编号,而且不同数据报之间是连续编号的。
3.确认号:表示当前主机作为接收端时,期望接收的下一个字节的编号是多少,也表示当前主机已经正确接收的最后一个字节序号+1。
4.数据偏移(报文首部长度):它表明了数据报头部(也就是TCP首部长度)的长度,若不存在选项,则这个值为20字节,数据偏移的最大值是60字节。
5.保留字段:暂时忽略,值全为0
6标志位:URG(紧急)为1时表明紧急指针字段有效,ACK(确认)为1时表明确认号字段有效,PSK(推送)为1时接收方应尽快将这个报文段交给应用层,RST(复位)为1 时表明TCP连接出现故障必须重建连接,SYN(同步)在连接建立时用来同步序号,FIN(终止)为1 时表明发送端数据发送完毕要求释放连接
7.接收窗口:该字段用于实现TCP的流量控制
8.校验和:用于接收端检验整合数据包在传输过程中是否出错
9.紧急指正:用于标识紧急数据的尾部
10选项字段:可选
TCP可靠传输时如何实现的
TCP的可靠性表现在:它向应用层提供的数据是无差错的、有序的、无丢失的,简单点说就是:TCP最终递交给应用层的数据和发送者发送的数据是一样的。TCP采用了流量控制、拥塞控制。连续ARQ等技术来保证它的可靠性。
PS:网络层传输的数据单元为【数据报】,传输层的数据单元为【报文段】,但为了方便起见,可以统称为【分组】。
TCP(传输控制)协议的特点
1.TCP是面向连接的:通信钱需要建立连接,通信结束需要释放连接
2.TCP提供可靠交付服务:所谓“可靠”指的是:TCP发送的数据无重复、无丢失、无错误并与发送端顺序一致
3.TCP是面向字节流的:所谓“面向字节流”指的是:TCP以字节为单位。虽然传输过程中数据被划分为一个个数据段,但这只是为了方便传输,接收端最终接收到的数据将会和发送端的数据一样
4.TCP提供全双工通信:所谓的“全双工通信”指的是:TCP的两端既可以作为发送端也可以作为接收端。
5.一条TCP连接的两端只能有两个端点:TCP只能提供点到点(或者叫端到端)的通信,而UDP可以是任意方式的通信
注意:TCP连接和套接字的关系 :TCP连接是一个抽象的概念,表示一条可以通信的链路,每条TCP连接有且仅有两个端点,表示通信的双方。一条TCP连接的两端就是两个套接字,也就是TCP连接=(套接字1,套接字2)=(IP1:端口号,IP2 :端口号)
停止等待协议
停止等待协议也就是ARQ协议的一种,TCP保证其可靠性采用的是更为复杂的滑动窗口协议,但停止等待协议是它的简化版,为了方便理解,这里先介绍停止等待协议。
ARQ协议:自动重传请求。顾名思义,当请求失败时它会自动重传请求,直到请求被正确接收为止。这种机制保证了每个分组都能被正确接收。停止等待协议是一种ARQ协议
停止等待协议的原理:1.无差错的情况:A向B发送一个分组,都要停止发送,等待B的确认应答;A只有收到B的确认应答之后才能发送下一个分组。2.分组丢失和出现差错的情况:发送者拥有超时计时器。没发送一个分组便会启动超时计时器,等待B的应答。若超时仍未收到应答,则A会重发刚才的分组。分组出现差错:若B收到分组,但通过检查和字段发现分组在运输途中出现差错,它会直接丢失该分组,并不会有任何其他动作。A超时后便会重新发送该分组,直到B正确收到为止。分组丢失:若分组在途中丢失,B并没有收到分组,因此也不会有任何响应。当A超时后也会重传分组,知道正确接收该分组的应答为止。综上所诉:当分组丢失或出现差错的情况下,A都会超时重发分组。3.应答丢失和应答迟到的情况:TCP会给每个字节都打上序号,用于判断该分组是否已经接收。应答丢失:若B正确收到分组,并已经返回应答,但应答在返回途中丢失了。此时A也收不到应答,从而会超时重传。紧接着B又收到了该分组。接收者根据序号来判断当前收到的分组是否已经接收,若已接收则直接丢弃,并补上一个确认应答。 应答迟到:若由于网络拥塞,A迟迟收不到B发送的应答,因此会超时重传。B收到该分组后,发现已经接收,便丢弃该分组,并向A补上确认应答。A收到应答后便继续发送下一个分组。但经过了很长时间后,那个失效的应答最终抵达了A,此时A可根据序号判断该分组已经接收,此时只需简单丢弃即可。
停止协议注意点:1.每发送完一个分组,该分组必须被保留,直到收到确认应答为止。2.必须给每个分组进行编号。以便按序接收,并判断该分组是否已经被接收。3.必须设置超时计时器。没发送一个分组就要启动计时器,超时就要重发分组。4.计时器的超时时间要大于应答的平均返回时间,否则会出现很多不必要的重传,降低传输速率。但超时时间也不能太长。
-
-
-
TCP的流量控制
什么是流量控制?
答:如果发送者发送过快,接收者来不及接收,那么就会有分组丢失。为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。
流量控制的目的?
答:流量控制根本目的是为了防止分组丢失,它是构成TCP可靠性的一方面。
如何实现流量控制?
由滑动窗口协议(连续ARQ协议)实现。滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。
流量控制引发的死锁?
答:当发送者收到了一个窗口为0 的应答,发送者便停止发送,等待接收者下一个应答。但是如果这个窗口不为0 的应答在传输过程中丢失,发送者一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。
持续计时器?
答:为了避免流量控制器引发的死锁,TCP使用了持续计时器。每当发送者收到一个0窗口的应答后就会启动该计时器。时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回0窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失,此时重置发送窗口后开始发送,这样就避免了死锁的产生。
传输层的作用
传输层是为它上面的应用层提供端到端的通信服务,保证了数据包的顺序传送及数据的完整性(如何保证数据的完整性在后面说明),在OSI七层模型中(或者TCP/IP模型中传输层也是和OSI模型的传输层对应的),传输层是面型通信的最高层,也是用户功能的最底层
-
UDP(用户数据报)协议的特点
1.UDP只在IP数据报服务的基础上增加了少量的功能:复用与分用、对整个报文的差错检查
2.UDP是无连接的:通信前不需要建立连接,通信结束也无需释放连接
3.UDP是不可靠的:它是尽力而为,不能确保每一个数据报都送达
4.UDP是面向报文的L所谓“面向报文”指的是:UDP数据传输的单位是报文,且不会对数据作任何拆分和拼接操作。在发送端,应用程序给传输层的UDP什么样的数据,UDP不会对数据进行拆分,只会增加一个UDP头并交给网络层。在接收端,UDP收到网络层的数据报后,去除IP数据报头部后遍历交给应用层,不会作任何的拼接操作。
5.UDP没有拥塞控制:UDP始终以恒定的速率发送数据,并不会根据网络拥塞情况对发送速率做出调整。这种方式有利有弊
6.UDP支持一对一、一对多、多对多、多对一通信,而TCP只支持一对一通信
7.UDP首部开销小,只有8字节,而TCP首部至少是20字节,相对来说UDP更高效。
注意:前面说UDP通信是不可靠的,具体体现在数据报可能会丢失和数据报的顺序会不会出现问题
-
-
-
-
-
-
-
-