图解TCP/IP协议(六)传输层(TCP/UDP)、tcp三次握手和四次挥手

传输层最常见的两种传输协议,分别是TCP和UDP协议。

一、TCP协议
TCP 是面向有连接的流协议。流就是指不间断的数据结构,可以把它想象成排水管道中的水流。TCP为提供可靠传输,实行“顺序控制”或“重发控制”机制。

TCP/IP的众多应用大多以客户端/服务端的形式运行。作为服务端的程序需要提前启动,准备接收客户端的请求。下面是一个服务端接收处理一个HTTP请求的过程:

在这里插入图片描述

这些服务在UNIX系统中叫做守护进程。例如HTTP的服务端程序是httpd(HTTP的守护进程)。在UNIX中不需要将这些守护进程逐个启动,而是启动一个可以代表它们接收客户端请求的inetd(互联网守护进程)服务程序即可。它是一种超级守护进程。该超级守护进程收到客户端请求以后会复刻(fork)新的进程并转换(exec)为sshd等各个守护进程。

端口号:确认一个请求究竟发给的是哪个服务端(守护进程),可以通过所接收到数据包的目标端口号来识别,例如上图,如果目标端口为22,则转给sshd进程。

进程的端口号确定,有一些时标准规定的,例如:HTTP、TELNET、FTP所使用的端口号就是固定的。知名的进程端口一般被分配在0—1023之间。端口号大都分布在1024—49151的数字之间。

TCP连接(三次握手)与关闭(四次挥手):在TCP传输数据之前,发送端主机需要与目标主机之间建立连接;数据传输结束后,需要切断连接。下图为建立连接和切断连接的流程。

前三个流程为三次握手,后四个流程为四次挥手。SYN(Synchronize sequence numbers)

在这里插入图片描述

为什么TCP连接的时候需要三次握手,断开连接的时候却需要四次挥手?

因为在连接时接收端在接收到发送端的SYN后,可以立即将ACK和SYN一起发给客户端。但是切断连接时,接收端在接收到FIN后,此时接收端可能还有未发送完毕的数据,不能立即断开连接,所以此时,只能先将ACK(针对FIN的应答)先发给发送端,等到该处理的都处理完毕后,此时可以断开连接了,再向发送端发送FIN请求断开连接。

TCP数据传输需要克服的几个问题:

TCP充分实现了数据传输时的各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。只有在确认通信对端存在时,才会发送数据,从而可以控制通信流量的浪费。

TCP在实现上述功能时,必须要解决以下几个问题:

  • 数据的破坏
  • 丢包
  • 重复发送
  • 分片顺序混乱

TCP传输中的序列号:在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做认应答ACK(Positive Acknowledgement)。发送端在发送数据一段时间后没有等到确认应答,发送端就认为数据已经丢失,并进行重发。下面是几种情况下的数据传输流程。

1、正常的数据包传输

在这里插入图片描述

2、数据包丢失的情况

在这里插入图片描述

3、数据包并未丢失,但是确认应答ACK丢失了,这种情况,也有可能是因为一些原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也屡见不鲜。此时,源主机只要重发数据即可,但是对于目标主机来说,反复收到相同的数据简直是一种灾难。所以目标主机必须放弃已经重复的数据包。图中数据包的序列号就是为了解决这些问题的。

在这里插入图片描述

相关概念

  • 序列号是按顺序给发送数据的每个字节(8位字节)都标上号码的编号。
  • 序列号的初始值并非为0,而实在建立连接以后由随机数生成。后面的则依次一字节加一。
  • TCP的数据长度并未写入TCP的首部,实际通信中求得TCP包的长度的计算公式是:IP首部中的数据包长度减去IP首部的长度。
  • 重发超时的时间确定:tcp在每次发包时都会计算往返时间(RTT,Round Trip Time)及其偏差(RTT时间波动的值,方差,有时也叫抖动)。将这个往返时间和偏差相加,重发时间就是比这个总和要稍大一些。

TCP首部:

有关于首部中的校验和介绍立即查看

在这里插入图片描述

  • 源端口号:表示发送端端口号,字段长16位。
  • 目标端口号:表示接收端端口号,字段长16位。
  • 序列号:是指发送数据的位置,每发送一次数据,就累加一次该数据字节数的大小。初始值不是从0或1开始,是由计算机生成的一个随机数。字段长32位。
  • 确认应答号:是指下一次应该收到的数据的序列号。发送端收到这个确认应答以后可以认为在这个序列号以前的数据已经被正常接收。
  • 数据偏移:该字段表示TCP所传输的数据部分应该从TCP包的那个位开始计算,可以把它看作TCP首部的长度。字段长4位。
  • 保留:为了以后扩展时使用,长度为4位。
  • 控制位:从左至右分别是,如下图:
    在这里插入图片描述在这里插入图片描述
  • 校验和:立即查看
  • 紧急指针:只有在URG控制位为1时有效。该字段的数值表示本报文中紧急数据的指针。紧急指针指出了紧急数据的末尾在报文段中的位置。紧急指针一般用于中断通信的情况。例如:在Web浏览器中点击停止按钮、在使用telnet时输入Ctrl+C时会有UGR为1的包。
接入以太网的主机之间的通信流程如下:

在这里插入图片描述

为了提高传输速度:TCP引入了窗口的概念。也就是一次发送多个数据包,处理多个应答。
在这里插入图片描述

如果窗口中又部分数据丢失,也不会将整个窗口中的数据进行重发。窗口的告诉重发机制如下:在这里插入图片描述

二、UDP协议

UDP(User Datagram Protocol)是不具有可靠性的数据报协议,UDP可以确保发送消息的大小,却不能保证消息一定会送达。UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。UDP传输途中如果出现丢包,UDP也不负责重发。如果出现包到达顺序乱掉时也没有纠正的功能。关于包的细节控制,只能由应用程序来控制。

UDP是收到应用程序发来数据的那一刻,立即按照原样发送到网络上的一种机制。

UDP面向无连接,可以随时发送数据。再加上UDP本身的处理既简单又高效,经常被用于一下几个方面:

  • 视频、音频等多媒体通信(即时通信)
  • 广播通信(广播、多播)

TCP虽然可靠,但是却不一定处处优于UDP,UDP主要用于对高速传输和实时性要求较高的通信或广播。例如:打电话,即使缺少了一小部分的数据,也不会影响信息的传输的。

UDP首部:

有关于首部中的校验和介绍立即查看
在这里插入图片描述

三、套接字Socket
应用中如果使用了TCP或者UDP时,会用到操作系统提供的类库。两者都会广泛使用到套接字(socket)的API。套接字原本是由BSD UNIX开发的,后来又被移植到了Windows以及嵌入式操作系统中。应用在使用套接字时,可以设置对端的IP地址、端口号,实现数据的发送与接收。

服务器识别多个请求的例子:

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值