TCP/连接和OSI七层参考模型

物理层:包含你了多种与物理介质相关的协议,这些物理介质用以支撑TCP/IP通信。

数据链路层:包含了控制物理层的协议:如何访问和共享介质,怎样标识介质上的设备,以及在介质上发送数据之前如何完成数据成帧。典型的数据链路协议有IEEE802.3/以太网,帧中继,ATM以及SONET

Internent层:与OSI的网络层相对应,主要负责定义数据包格式和地址格式,为经过逻辑网络路径的数据进行路由选择

传输层:指定了控制Internent层的协议。这就像数据链路层控制物理层一样,传输层和数据链路层都定义了流控和差错机制。二者不同之处在于,数据链路层协议强调控制数据链路上的流量,即连接两台设备的物理介质上的流量;而传输层控制逻辑链路上的流量,即两台设备的端到端的连接,这种逻辑连接可能跨越一连串数据链路

应用层:对应于OSI的会话层,表示层,应用层。最常用的服务是向用户提供访问网络的接口。

主机到主机层:

尽管网络层负责网络之间的逻辑路径,但是主机到主机层是负责两个在完全不同网络上的主机之间的全程逻辑路径。从另外一个角度看,主机到主机层向应用提供了一个到协议簇下一层的接口,使得应用不必关心它们的数据实际上是如何被传送的。

主机层到主机层提供两个主要的服务:TCP和UDP

TCP:

传输控制协议,想应用提供了可靠的,面向连接的服务。换句话说,TCP提供了一个类似于点到点的连接

点到点连接有两个特点:

  • 仅存在一条到达目的地的路径。进入连接的数据包不会丢失,因为数据包唯一可去的地方就是连接的另一端。
  • 数据包达到的顺序与发送顺序相同

TCP提供了一条看似点到点的连接,虽然实际上这条连接并不存在。TCP利用的Internet层可以提供无连接的,尽力而为转发的服务。这类似于邮政服务,一叠新一旦交给邮递员后,谁也不能保证信件将按照原先叠放的顺序依次送达,也不能保证信件都将在同一天送到,甚至不能保证全部送到。邮政服务仅仅能够承诺尽最大努力邮寄这些信件

同样的,Internet层不保证所有的数据包使用相同的路径,也不能保证数据包到达时仍保持方法时的顺序和间隔或者全部达到

在无连接服务上,TCP使用了3种基础的机制实现面向连接的服务:

  • 使用序列号对数据包进行标记,以便TCP接收服务在向目的应用传递数据之前修正错序的数据包排序
  • TCP使用确认,校验和定时器系统提供可靠性。当接受者按照顺序识别出数据包未能达到或发生错误时,接收者将通知发送 者,或者接收者在特点时间内没有发送确认信息,那么发送者就认为在发送结束后数据包没有到达接收方。在这两种情况下,发送者都会考虑重新传数据包
  • TCP使用窗口机制调整数据包的流量:窗口机制可以减少因接受方缓冲区满而造成丢失数据包的可能性。

TCP在应用层数据上附加了一个报头,报头包括序列号字段和这些机制的其他一些必要信息,如叫做端口号的地址字段,该字段可以标识数据的源和目标应用程序。为了传送数据。应用数据及附加的TCP报头被封装在IP数据包内。


建立TCP需要三次握手才能建立:而断开连接需要四次挥手:



如何建立的连接:


首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

断开TCP连接:


假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传Server端收到ACK后,"就知道可以断开连接了"Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了OkTCP连接就这样关闭了!

整个过程Client端所经历的状态如下:

Server端所经历的过程如下


【注意】 TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

【问题】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告 Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。



UDP:

用户数据协议。提供可一种无连接,尽力而为传送的数据包转发服务。UDP的优点是不花时间建立连接,直接发送数据,用UDP替代TCP,可以使发动小数据量的应用取得更好的性能优势。UDP还有一个优点:UDP报头长度远远小于TCP报头长度














猜你喜欢

转载自blog.csdn.net/qq_36391075/article/details/79533894