TCP/IP 协议
TCP/IP 参考模型
应用层
OSI参考模型中的会话层、表示层和应用层的功能
传输层
让应用程序之间实现通信;通过端口号识别;代表性协议:TCP、UDP协议;
端口号识别;
实现端口之间的逻辑通信
网络层
在网络与网络相互连接的环境中,将数据从发送端主机发送到接收端主机。
IP地址识别;
实现IP地址间的逻辑通信
网络通信层(数据链路层)
网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。
主机 → 主机(网络层)
端口 → 端口(运输层)
网络层协议
IP协议
IP是跨域网络传送数据包,使整个互联网都能够收到数据的协议。
不具有重发机制,属于非可靠性传输协议。
ICMP
异常通知。
传输层协议
TCP协议
是一种面向有连接的传输层协议。它可以保证两端通信主机之间的通信可达。TCP能够正确处理在传输过程中丢包、传输顺序乱掉等异常情况。此外,TCP还能够有效利用带宽,解缓网络拥堵。
然而,为了建立与断开连接,有时它需要至少 7 次的发包收包,导致网络流量的浪费。此外,为了提高网络的利用率,TCP协议中定义了各种各样复杂的规范,因此不利于视频会议(音频、视频的数据量既定)等参合使用。
UDP协议
UDP(User Datagram Protocol)有别于TCP,它是一种面向无连接的传输协议。UDP不会关注对端是否真的收到了传送过去的数据,如果需要检查对端是否收到分组数据包,或者对端是否连接到网络,则需要在应用程序中实现。
UDP常用于分组数据较少或多播、广播通信以及视频通信等多媒体领域。
端口号如何确定
确定端口号的方法分为两种:
■ 标准既定端口号
■ 时序分配法
握手:即一次发包到接收的过程,可能从客户端发送到服务端,也可能从服务端发送到客户端。
三次握手
发送端首先发送一个带 SYN 标志的数据包给对方。
接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。
最后,发送端再回传一个带 ACK 标志的数据包,代表“握手”结束。
四次挥手
发送端首先发送一个带 FIN 标志的数据包给对方。
接收端收到后,先回传一个带有 ACK 标志的数据包,等接收端所有请求都处理完成,再回传一个带 FIN 标志的数据包。
最后,发送端再回传一个带 ACK 标志的数据包,代表“挥手”结束。
接收端收到 ACK 标志的数据包后,关闭连接;
发送端等待 2MSL 没收到接收端重发的数据包,关闭连接。
为什么TCP客户端最后还要发送一次确认呢?
一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。
如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。
为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。