TCP/IP网络模型
点击上方☝SpringForAll社区 轻松关注!
本文来源:http://u8s.net/m9hfi
“TCP/IP协议:因特网互联协议,由网络层的IP协议和TCP协议组成,Internet最基本的协议、Internet国际互联网络的基础。
”
分层模型
为了减少网络设计的复杂性,大多数网络都采用了分层结构。在相同的网络中,处于第N层的机器之间使用第N层的协议进行通信。
不同机器中包含的对应层的实体叫做对等进程。在对等进程利用协议进行通信时,并不是直接将数据从一台机器的第N层传送到另一台机器的第N层,而是每一层都把数据连同本层的控制信息打包交给它的下一层,它的下层把这些内容看做数据,再加上它一层的控制信息交给更下一层,以此类推,直到最下层的物理介质,由它进行实际的通信。每层定义的数据结构以及提供上层的服务被称为协议,层和协议的集合被称为网络体系结构。
TCP协议
TCP提供了一种面向连接的可靠的字节流传输层服务,将应用层数据封装成报文段,发送数据后启动定时器做超时重发,另一端对接收到的数据进行确认,对数据进行排序和校验,丢弃重复和无效数据;并提供端到端的流量控制。
每个TCP段都包含源端口号和目的端口号,用于寻找发送端和接收端应用进程,加上IP首部的源IP和目的IP就可以唯一确定一个TCP连接。
序号用来标识TCP发送端向TCP接收端发送的字节流,表示这个报文段中第一个数据字节,如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数,序号是32bit的无符号数,超过后从0开始。
确认序号则是发送确认的一端所期望收到的下一个序号,是上次成功收到的字节序号加1,只有ACK标志为1时确认序号字段才有效。
TCP为应用层提供全双工服务,即数据能在两个方向上进行独立地传输,因此连接的每一端必须保持各自方向上的传输数据序号。
首部长度是首部中32bit的数目。需要这个值是因为选项字段的长度是可变的。这个字段占4个bit,因此TCP的首部的最大长度是15 * 4 = 60 个字节。
TCP中有6个比特标志,URG=紧急指针有效;ACK=确认序号有效;PSH=接收方应该尽快将这个报文交给应用层;RST=重建连接;SYN=同步序号用来发起一个连接;FIN=发送端完成发送任务
连接的每一端都可以通过声明窗口大小来指明当前可接收的字节数,来实现对发送方的流量控制。
校验和覆盖TCP整个报文段:TCP首部和TCP数据。强制性字段,由发送端计算和存储,并由接收端进行验证。
只有当URG标志为1时紧急指针才有效。紧急指针是一个正向的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
最常见的可选字段是最大报文大小,MSS(Maximum Segment Size),每个连接方都在通信的第一个报文段(SYN标志)指明这个选项,表示本端所能接收的最大长度的报文段。
三次握手
TCP建立连接的过程需要双方进行三次通信,其目的是为了同步信息,如指定连接服务器的端口号,双方的初始序列号。由于信道是不可靠的,为了保证数据传输的可靠性,就需要在建立连接时就双方的初始序列号达成一致,以便于在后续的数据传输中对收到的数据进行确认。
第一次握手,连接发起方A发送A端的序列号;第二次握手,连接接收方B确认并返回B的序列号;第三次握手,A端确认收到B端回应的信息;
缺少第三次握手则就无法确认连接发起端是否收到接收端的信息,因此为了保证数据传输的可靠性,必须经过三次握手。
四次握手
TCP连接的关闭需要四次通信,因为TCP连接是全双工(数据在两个方向能同时传递),所以每个方向必须进行单独的关闭。一方完成了它的数据发送任务后可以发送FIN来终止这个方向的连接,当一方收到FIN后,应该通知应用层另一端已经终止了那个方向的数据传送,但仍然可以继续发送数据。
第一次握手,发起方A发送FIN,说明A端已经发送完数据,终止了这个方向数据传送;第二次握手,接收方B发送ACK,说明B端已经接收完A发送的数据;第三次握手,接收方B发送FIN,说明B端也已经发送完数据,并终止了这个方向的数据传送;第四次握手,发起方A发送ACK,确认A端已经接收完B发送的数据;
TIME_WAIT
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
为了保证发送的最后一个ACK报文段能够到达B端 防止“已失效的连接请求报文段”出现在新连接中。在发送完最后一个ACK报文段后,再经过实践2MSL,就可以使连接内所产生的所有报文段,都从网络中消失。这样就可以使下一个新的连接中不会出现旧的报文段
TCP状态转换
墙裂推荐
【深度】互联网技术人的社群,点击了解!
关注公众号,回复“spring”有惊喜!!!
如果资源对你有帮助的话