「作者主页」:士别三日wyx
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「专栏简介」:此文章已录入专栏《计算机网络零基础快速入门》
网络层根据IP地址将数据从源主机传输到目的主机,主机可以提供很多服务,比如Web服务、FTP服务等,需要使用 IP地址+端口号 来区分不同的服务。
因此,我们得先知道端口是什么。
端口(port)是设备与外界通信的出口,就像进出房子的门。
一台主机有65536个端口,用端口号来标记,范围是 0~65535 ,其中:
当主机收到数据包后,会根据报文首部的目的端口号,把数据发送到对应的端口;等数据处理完毕后,再根据报文首部的源端口号,原路返回。
比如,主机收到一个数据包,报文首部的目的端口号是80,传输层就会把这个数据包交给80端口对应的Web服务去处理。
那么,数据是怎么在端口之间进行传输的呢?答案是数据传输协议。
传输层提供了两种数据传输协议:TCP和UDP。
UDP协议(User Datagram Portocol),也叫「用户数据报协议」,是一种无连接的数据传输协议。
UDP协议有三个特点:无连接、不可靠、传输速度快。
1)「无连接」是指,发送方和接收方不需要建立连接,就能直接传输数据。
2)「不可靠」是因为,UDP使用报文首部的检验值来保证数据的安全。发送方通过算法计算出校验值,接收方收到后再重新计算,如果数据被篡改或者被噪音损坏,校验值就会发生变化,UDP就可以检查出错误。但UDP只检错而不纠错,出错的信息会被扔掉或者发送警告信息。并且UDP不对数据进行分组和排序,不能判断数据是否安全完整的传送,可靠性较低。
3)「传输速度快」是相对于TCP来说的,UDP的头部只有8个字节(TCP有20个字节),不包含控制信息,只是尽最大的努力去传输数据,因此速度很快。
由于不可靠但速度快的特点,UDP适合视频和音频这种对数据完整性要求不高的应用。
UDP的报文在IP数据报的数据部分,如下图所示:
UDP报文分为首部和数据两个部分,首部包含4个字段:源地址、目的地址、UDP长度、校验和。
TCP报文同样保存在IP数据报的数据部分,占用20个字节,比UDP报文多了一些控制字段。
TCP是基于连接的传输协议,传输过程分为三个阶段:建立连接、数据传输、释放连接。
TCP在传输数据前需要建立连接,也就是我们常说的三次握手,过程如下:
下面是Wireshark抓取的TCP三次握手数据包,重点看我圈中的地方:
第一次握手:客户端发送一个SYN,随机生成一个发送序列号 Seq=x,服务器看到SYN就会知道,这是一个建立连接的请求。
第二次握手:服务器响应了一个ACK和一个SYN,把收到的Seq的值加上1,放到Ack里面(Ack = x+1),客户端可以根据这个Ack的值判断连接是否有误,然后再随机生成一个Seq=y。
第三次握手:客户端发送一个ACK,把响应回来的Seq的值加上1,放到Ack里面(Ack = y+1),服务器同样可以根据这个Ack的值判断连接是否有误,如果没有错误就建立连接,开始传输数据。
数据传输完成后,需要释放连接;
由于TCP是「全双工」通信,两个方向的连接都得单独关闭,因此,需要两次请求和响应,也就是我们常说的四次挥手,过程如下:
为什么建立连接是三次,关闭连接却是四次?
TCP是全双工通信,有两条连接,当一方发送完数据后,并不能确定对方是不是也发送完了数据,因此只能关闭单方向的连接,等到对方也发送完数据后,再关掉另一个方向的连接。
TCP协议的可靠主要依赖三个机制:分包、排序确认、超时重传。
1)TCP将应用层的数据拆分成多个数据包,给每个包一个「序号」,接收方可以根据序号保证数据的顺序。
2)TCP使用首部「校验和」字段保证数据的准确性,发送和接收时都要计算校验和,校验和一致则判定数据正常,接收方就响应一个确认(ACK),表示数据已经收到了。
3)如果在规定时间内,发送方没有收到接收方的确认(ACK),则判定数据丢失,重新发送这个数据包,也就是「超时重传」。