TCP/IP协议

本文详细介绍了TCP/IP协议的工作原理,包括TCP的三次握手建立连接和四次分手关闭连接过程,以及长连接和短连接的概念。此外,还提到了UDP协议的特点和应用场景,以及如何在需要可靠传输时对UDP进行改造。
摘要由CSDN通过智能技术生成

目录

TCP是什么?它是做什么的?

长连接与短连接

三次握手

Socket详解

四次分手

UDP:用户数据报协议

UDP与TCP的不同

适用场景

UDP改造


当我们在浏览器中输入一个网址,点击回车后,网页就会在我们的屏幕上展现出来。但是,这背后发生了什么呢?为了让我们能够访问互联网上的资源,计算机之间需要进行通信。而这种通信是通过一系列的协议来实现的。其中,TCP/IP协议是互联网最基础的协议之一,它负责将数据从一个计算机传输到另一个计算机。本文将详细介绍TCP/IP协议的工作原理和实现方式,以及它在互联网中的应用。

 TCP模型(Transmission Control Protocol Model)是一个计算机网络模型,它是TCP/IP协议族中的一个重要组成部分。相比于传统的OSI七层模型,TCP/IP模型相当于把表示层与会话层糅合到应用空间去了。

计算机中存在着两大类程序,一类程序是内核程序,是操作系统的核心部分。内核程序负责管理计算机硬件和软件资源,为其他应用程序提供服务和保护系统的安全性和稳定性。

另一种就是给用户使用的应用程序(Applicayion),是为了满足用户的特定需求而编写的。应用程序通常包括各种类型的软件,例如文本编辑器、电子邮件客户端、图像处理软件、游戏、办公套件和数据库管理系统等。我们在软件开发的过程中写的都是这种程序。

在TCP模型中,传输层,网络层,链路层,物理层的交互都是由内核来实现的。在一个计算机当中,我们的微信,QQ,游戏等等都可以进行通信,不同的程序在通信的过程中有一部分功能是一致的,这些代码不需要重复的开发。这些程序通讯时都是通过网卡向外发数据,访问不同的服务器。那么如何管理,如何使用通用的资源(即传输层,网络层,链路层,物理层的操作),这一部分放在了内核,由内核开发人员已经设计完成,这之中既有规则,也有资源管理,也有建立连接的过程等等。

其余的,不同程序发送的数据的表示形式,可靠性,安全性,是否加密等等,就留给应用程序个性化完成了。

注意,不同的网络层次有不同的协议。在计算机网络中,通常使用分层的协议栈来处理数据传输和通信。每个层次都有自己的协议,它们在完成特定功能的同时,也与其他层次的协议进行交互和通信。

当我们使用程序与外部连接的时候,我们的程序需要调动内核来建立连接,无论应用层是什么协议,调用内核的时候都需要做这些操作:

在传输控制层建立连接。这一层常见的协议有TCP协议,UDP协议。我们这期重点来讲TCP协议。

TCP是什么?它是做什么的?

关键词:面向连接的,可靠的传输。

这里的连接并不是指在我们的电脑与服务器之间插一根物理网线,这是一种虚拟的连接。在TCP协议中,这种连接是通过三次握手建立的。三次握手完成之后才会有数据传输,在数据传输之后又会有四次分手。这里建立的连接可以分为长连接和短连接。

长连接与短连接

长连接是指在三次握手建立连接之后,客户端和服务器之间可以持续的发送与接收消息,这一过程可以持续几毫秒,几秒,几小时,甚至几天、几年。直到双方谁也不需要再继续交流再断开。短连接是指客户端和服务器之间的连接只在数据传输时建立,传输完成后立即断开连接。

这种连接一般在应用层体现,比如在http1.0协议中默认使用的就是短连接,在http1.0协议中,客户端像服务器发送一个请求,服务器回复之后会立即断开,即便再连续发,服务器的输入流也不会再处理第二个输入。这意味着每次请求都需要重新建立连接,传输完成后立即断开连接。这种方式可以减少服务器的负载,但是每次建立连接的过程会耗费一定的时间和资源。

值得注意的是,http1.1默认使用长连接(keep-alive connections),也就是每次请求完成后不会立即断开连接,而是保持连接状态,等待下一次数据传输。实现方式很简单:服务器中的input做了一个循环,一直读取,每读取一个请求就抛给一个线程,这就实现了连续的发送与连续的回复。

三次握手

三次握手是建立TCP连接的过程,它由客户端和服务器之间的三个步骤组成。下面是三次握手的过程:

1.首先,客户端会向服务器发送一个SYN(Synchronize)数据包其中包含一个随机的初始序列号(ISN)。SYN标志位被设置为1,表示这是一个连接请求包。

2.服务器会回复一个SYN-ACK(Synchronize-Acknowledgement)数据包,表示我收到了你的请求,我们之前说的TCP的关键词可靠性就是由ack来保证的。该确认号是客户端发送的ISN加1,并包含服务器自己的随机序列号。

3.客户端再回复一个ACK(Acknowledgement)数据包,表示我接收到了客户端的回复,该包中包含了服务器发送的确认号,该确认号是服务器的ISN加1。三次交接之后,客户端和服务器都知道各自的输入输出都正常。

为了方便理解,我们举一个例子:

小明和小红分别住在相邻的两栋楼,他们想要聊天需要隔着窗子互相向对方喊话 

小明:小红小红,我想和你聊天,你能听到我讲话吗?(此时就相当于小明发送了一个syn包,表面发起请求)

小红:我听到你讲话啦,你能听到我讲话吗?(小红回复一个syn+ack包,ack表示确定,我已接收到你的信息,syn表明也向小明发起聊天请求)

小明:我也能听到你说话,我们可以开始聊天啦。(小明回复一个ack包,表明可以接收到小红的信息,至此,小明和小红都确定自己的话对方能听到,对方的话自己也能听到)

三次握手之后,双方会开辟资源(如接收队列已经发送队列),切换状态,即切换至(ESTABLISHED)状态。这便建立了所谓的连接。

使用netstat命令我们可以看到计算机当前系统的网络连接情况,而我们看到的每个条目对于程序员来说其实就是一个socket。

Socket详解

Socket是应用程序和网络之间的接口,可以通过Socket实现应用程序和网络之间的数据传输。

在建立TCP连接时,客户端和服务器都需要创建Socket对象。客户端通过Socket对象向服务器发起连接请求,服务器则通过Socket对象接收连接请求。在连接建立后,双方都可以通过Socket对象进行数据传输和通信。

在底层的网络连接中,需要开辟一定的资源来处理数据传输过程中的各种事件,包括缓存区、计算能力,接收队列、发送队列等。Socket对象对这些资源进行了封装和管理,使得应用程序可以更加方便地进行网络通信。

当上层的应用程序需要与服务器,或者其他计算机上的应用程序交互的时候,其实本质上二者之间并没有建立真正的连接,我们的程序都是在与内核进行交流,从接收队列中读取消息,再把要发送的消息送到发送队列中。所以程序就是在单机内部与内核交互,至于内核是如何把数据发送给对方、这些发送如何在双方之间来回确认,都是由内核来实现的,开发人员不需要关心。

那么程序与内核之间是如何交互的呢?是阻塞还是非阻塞还是多路复用器等等,这种应用程序在进行输入输出操作时所采用的方式就是IO模型所描述的了。

 那么socket到底是什么?为了方便大家理解,这里我们采用马士兵老师的“四元组”理论来讲解

四元组指的是四个成分:源ip,源端口,目标ip,目标端口,可以将socke理解为一组插头和插座,源的一端插在了目标端一端。这四项可以表示一个绝对唯一的连接。即在TCP协议中,一个连接是由客户端和服务器之间的四元组(源IP地址、源端口号、目的IP地址、目的端口号)唯一确定的。

举个例子:

假设我有一台电脑,电脑网卡的IP地址为A,开启了一个 客户端C,要连接到远程的服务器S,服务器网卡的IP为B,接收的端口号为80,那么双方最多可以建立多少个连接呢?

如果客户端在连接服务器的某个端口时使用了不同的源端口号,那么它可以与服务器建立多个TCP连接。因为TCP连接的唯一标识是四元组,即源IP地址、源端口号、目的IP地址和目的端口号,所以使用不同的源端口号可以创建不同的四元组,从而建立多个TCP连接。

我们假设客户端使用0号端口去连接服务器的80端口,此时连接的四元组为(IPA:0,IPB:80)。那么客户端的1号端口是否还能连接到服务器的80端口呢?如果用1号端口连接,那么此连接的四元组为(IPA:1,IPB:80),与0号端口的四元组不同,所以两个连接可以同时存在,以此类推,计算机一共有65535个端口,理论上可以与服务器的80端口建立65535个连接。

四次分手

四次分手指的是TCP连接的关闭过程,也称为TCP连接的终止过程。分手分的是双方已经建立的连接,其实就是把内核开辟的资源释放。TCP连接的关闭过程需要四个步骤,因此被称为四次分手。这四个步骤是:

  1. 第一次分手(FIN):当一方设备想要关闭连接时,它会发送一个FIN报文段,表示它已经完成了数据的发送。这个FIN报文段会告诉另一方设备,它不会再发送数据了。
  2. 第二次分手(ACK):另一方设备收到了第一个FIN报文段后,会发送一个确认报文段(ACK),表示它已经收到了这个FIN报文段。
  3. 第三次分手(FIN):另一方设备也发送一个FIN报文段,表示它也完成了数据的发送,不会再发送数据了。
  4. 第四次分手(ACK):第一个设备收到了第二个FIN报文段后,会发送一个确认报文段(ACK),表示它已经收到了这个FIN报文段。

我们再拿小明和小红举例子,两个人还在隔空喊话

小明:我不爱你了。(FIN,表示我已经没有数据要发送了)

小红:我知道了。(ACK,我收到你已经发送完毕的信息了)

小红:其实我也不爱你了。(FIN,我这边也没有数据要发送了)

小明:我知道了。(ACK,我也收到你已经发送完毕的信息了)

至此,小明和小红完成了分手信息交互,两人和平分手。

TCP协议是现代计算机网络中最为重要的协议之一,它的出现为互联网的发展奠定了坚实的基础。通过TCP协议,我们可以实现可靠的数据传输,保证数据的完整性和准确性,这为网络通信提供了强有力的保障。同时,TCP协议也具有较高的灵活性和可扩展性,能够适应不同的网络环境和应用需求。

UDP:用户数据报协议

UDP(User Datagram Protocol)是一种面向无连接的网络传输协议,它不保证数据传输的可靠性和顺序性,但是传输效率高,适用于需要高速传输而不需要数据准确性的场景。

UDP与TCP的不同

UDP协议与TCP协议一样都是在传输层中使用的协议,但是它们有很大的不同。TCP协议是一种面向连接的协议,它会在发送数据之前先进行三次握手建立连接,然后再进行数据传输,最后再四次握手关闭连接。而UDP协议则是没有连接的概念,发送方直接将数据发送给接收方,接收方收到数据后直接处理,不需要进行握手和关闭连接的过程。

由于UDP协议没有连接的概念,因此它的传输效率比TCP协议高,但是它也没有TCP协议那样的可靠性和顺序性,因此在需要数据准确性的场景中,一般会选择使用TCP协议。

适用场景

TCP协议适用于需要数据准确性和可靠性的场景,比如文件传输、电子邮件、网页浏览等。因为TCP协议会在传输数据之前进行三次握手建立连接,确保数据能够被正确地传输到接收方,并且在传输过程中会进行数据校验和重传等机制,确保数据的可靠性和准确性。

而UDP协议适用于需要高速传输而不需要数据准确性的场景,比如视频流、音频流、在线游戏等。因为UDP协议没有连接的概念,数据能够直接发送到接收方,不需要进行握手和关闭连接的过程,因此传输效率比TCP协议高。但是UDP协议也没有TCP协议那样的可靠性和顺序性,数据在传输过程中可能会丢失或者乱序,因此在需要数据准确性的场景中不适合使用UDP协议。

UDP改造

UDP是一种无连接的协议,它不保证数据包的可靠性和顺序。如果您需要在UDP上构建可靠的通信,您可以考虑进行改造。

以下是一些可能的UDP改造方法:

  1. 实现自己的可靠传输协议:您可以在UDP上构建自己的可靠传输协议,以确保数据包的可靠性和顺序。例如,您可以实现一个类似于TCP的可靠传输协议,该协议使用序列号和确认号来确保数据包的传输顺序和可靠性。

  2. 实现数据包重传机制:如果一个数据包在传输过程中丢失或损坏,您可以实现一个重传机制,以确保数据包能够被正确地传输。例如,您可以使用超时重传机制,当一个数据包没有收到确认时,就会重新发送该数据包。

  3. 使用流控制机制:如果您的应用程序需要在UDP上传输大量数据,您可以实现一个流控制机制,以避免发送方发送过多的数据导致接收方无法处理。例如,您可以实现一个基于窗口大小的流控制机制,以确保发送方只发送接收方能够处理的数据量。

请注意,UDP改造可能会增加复杂性并降低性能。因此,您应该根据您的具体需求和应用程序来决定是否需要进行UDP改造。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值