网络知识之TCP、UDP
网络知识之TCP、UDP
一、基础知识
1、数据的封装
当高层发送了应用数据后(比如:图中用QQ发送了一个Hello的消息),首先就会到达传输层,传输层会给应用层数据添加TCP/UDP
头,传输层会判断应用层的这个数据是从哪个应用软件过来的,即:找到对应的端口号,因此在TCP/UDP
头中是包含源端口与目的端口的信息的。例如:发送的是QQ消息,那么源端口就是发送方的进程端口,目的端口就是QQ服务器的对应端口(因为一般需要走QQ服务器,然后再到达接收方),因此传输层完成的是进程到进程之间的通信。(保证是同一个进程之间的通信,不会出现发送QQ消息,结果接收方在微信收到的情况)
注意:
- 端口号是属于应用层的,只有应用层协议才有端口号!
- 源端口号和目的端口号不一定是相同的。比如我们去访问网页,正常就是使用80端口号的Http协议,但并不是指源端口号和目的端口号都是80,而是指目的端口一定是80,源端口号是大于1024的随机端口(因为源端口号是源主机动态分配的,其值不小于1024),即:发送方需要什么服务,目的端口号才是服务(协议)对应的端口号,源端口只不过是取一个随机的端口号去和这个目的端口号形成TCP/UDP连接。(例如,下图中应用层协议是Http,代表目的端口号一定为80,源端口号是随机的)
2、各层协议及其依赖关系
国际标准组织定义了应用层的各个协议与TCP、UDP之间的依赖关系,比如应用层采用的ftp协议,那么当ftp数据到达传输层时,究竟是加TCP头还是加UDP头呢,这个标准就已经被定义好了,具体的依赖关系如下图所示,根据关系图我们可以知道:ftp数据到达传输层时,会选择使用TCP协议。
二、TCP协议和UDP协议
1、TCP协议
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。其主要的职责是:(1)实现主机之间进程到进程之间的通信(最主要)(2)保证可靠的数据传输。
2、UDP协议
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层通信协议。其主要的职责是:实现主机之间进程与进程之间的通信,但是不具备可靠性。
3、TCP和UDP协议的对比
(1)TCP可以保证可靠的数据传输,即:可以保证发送方发送的数据一定会到达接收方,因为TCP是面对连接的,意味着在数据的传输之前,需要建立连接,而且在传输的过程中还存在重传机制,故TCP是面向连接且可靠的;UDP无法保证可靠的数据传输,因为UDP是无连接的,发送过去之后,没办法保证一定能到达接收方,但UDP的传输速度要比TCP快。
(2)TCP头有20个字节,UDP头有8个字节。
TCP头部结构:
UDP头部结构:
TCP可以保证可靠的数据传输,
TCP协议能保证Hello这个数据一定能够到达对方,但UDP没办法保证。UDP的传输速度比较快,TCP的传输速度比较慢。
UDP头只有8个字节,TCP头有20个字节。
设备能完成哪一层相应的功能,它就在哪一层。
三、TCP三次握手与四次挥手
1、TCP三次握手
1、客户端发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。(SYN=1,seq=x,x为随机生成数值);
2、服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由回复端随机生成的,并且将SYN置为1,而且会产生ACK字段,ACK字段数值是在客户端发送过来的序列号seq的基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP建立请求已得到验证。(SYN=1,ACK=x+1,seq=y,y为随机生成数值)这里的ack加1可以理解为是确认和谁建立连接;
3、客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1表示,并且再次回复ACK验证请求,在服务端发过来的seq上加1进行回复。(SYN=1,ACK=y+1,seq=x+1)。
2、UDP四次挥手
1、客户端发送断开TCP连接请求的报文,其中报文中包含seq序列号,是由发送端随机生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x由客户端随机生成);
2、服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y由服务端随机生成);
3、服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦确认传输数据完毕,就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ACK=x+1,seq=z,z由服务端随机生成);
4、客户端收到服务端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq基础上加1,从而完成服务端请求的验证回复。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)
至此TCP断开的4次挥手过程完毕。