Linux网络编程(一)—— TCP/UDP的区别与联系以及各自的使用场景

TCP(传输控制协议 Transmission Control Protocol)


TCP向应用层提供可靠面向连接字节流传输服务。它能提供高可靠性能通信(即数据无误、数据无丢失、数据无失序、数据无重复到达)。

TCP特点

  • 面向连接
    使用TCP必须要先建立连接,建立连接之后双方的系统内核会为它们分配必要的资源,用来管理练连接的状态和传输的数据。在数据传输完成之后,涮坊需要关闭连接释放系统资源。
    TCP是全双工的(双方的读写操作可以在一条连接线上进行),并且是一对一的连接,所以需要广播或多播(目标是多个主机)的应用程序不能使用TCP服务,而是使用无连接的UDP服务。

  • 可靠地

    • TCP采用发送应答机制,即发送端发送的TCP报文段都必须得到接收方得回应才算发送成功;
    • TCP采用超时重传机制,即在发送端发送一段报文之后会启动定时器,在一段时间之后还没有得到接收端的回应,发送端会重新发送该段报文;
    • TCP报文最终都是以IP数据的形式发送的,IP数据到达的时候很有可能是重复或者乱序的,所以TCP模块还会对接收到的TCP报文段进行重排和整理,再交给应用程序。
  • 字节流
    TCP是字节流服务,对使用字节流服务的TCP的接收端和发送端都有缓冲区(内核空间中),当发送端 / 接收端,发送 / 接受一段数据,发送端 / 接收端可以将数据分为一段或几段,一次或者多次发出 / 读出。
    由此可以看出,TCP模块发出的TCP报文段的个数与应用程序执行写操作的次数无关;TCP模块读取的TCP报文段的个数与应用程序执行读操作的次数无关。

三次握手


下面我们说一说TCP三次握手的过程

  • 第一次,client向server发出连接请求数据包:“我可以给你发数据吗?”;
    在这个过程中client通过向server发送一个含有同步序列号的标志位的数据段给server,向server请求建立连接;
  • 第二次对话,server同意连接,并向client发送响应和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”;
    第二次握手时,server收到client的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应client,
  • 第三次对话,client再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”。
    此时,client收到这个数据段后,再发送一个确认应答,确认已收到server的数据段,”我已收到回复,我现在要开始传输实际数据了

这样3次握手就完成了,client和server就可以传输数据了.

四次挥手


TCP建立连接要进行3次握手,而断开连接要进行4次

第一次通信,当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求。
紧接着响应,主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1
然后主机B 端再提出反方向的关闭请求,将FIN置1
最后,机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束.

由TCP的三次握手和四次断开可以看出,TCP使用面向连接的通信方式,大大提高了数据通信的可靠性,使发送数据端和接收端在数据正式传输前就有了交互。

TCP数据包头


下图为TCP数据包头的格式
Linux网络编程(一)—— TCP/UDP的区别与联系以及各自的使用场景_第1张图片

  • 源端口、目的端口:16位,表示出本地和远端的端口号(报文段来自哪里(源端口),传递给哪个上层协议或者应用程序(目的端口号)),进行TCP通讯时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名端口号。在Linux系统中,一些知名服务使用的端口号定义在/etc/services中。
  • 顺序号:32位,标识发送的数据包的顺序;一次TCP通讯(从TCP连接的建立到断开)的过程中,一个传输方向上的字节流的每一个报文的编号。假设从A向B发送数据时,发送的第一个报文段的序号之就被系统设置成某个随机值ISN,如果某个报文段传输的数据时整个字节流的第1024~2048字节,那么该报文的序号值为ISN+1025,下一个报文的序号值为ISN+2049;
  • 确认号:32位,用于对对方发来的TCP报文段的响应,其值为收到的TCP报文段的序号值加1;
  • TCP头长:4位,表明TCP头中包含多少字节;
  • 6位未用;
  • URG:
  • ACK:ACK位置一,表明确认号是合法的;如果ACK为0,那么数据包不包含确认数据,确认数据被忽略;
  • PSH:表示是带有PUSH标志的数据。因此请求数据包一到接收方便可送往应用程序而不必等到缓冲区装满时才传送;
  • RST:用于复位由于主机崩溃或其他原因而出现的错误的连接,还可以用于拒绝非法的数据包或拒绝连接请求;
  • SYN:用于建立连接;
  • FIN:用于关闭连接;
  • 窗口大小:16位,这是TCP流量控制的一个手段,表示确认了字节数之后还可以发送多少字节数;
  • 校验和:16位,为了确保高可靠性而设置的,它校验头部和数据之和,由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。作为TCP可靠传输的重要保障,这个校验不仅包括TCP头部,也包括数据部分;
  • 可选项:0或多个32位,包括最大TCP载荷、串口比例、选择重发数据包等选项。

UDP(用户数据报协议 User Data Protocol)


UDP是一种面向无连接不可靠传输协议,具有资源消耗小,处理速度快的特点。
UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

UDP特点

  • UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
  • 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
  • UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
  • 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
  • UDP使用****加粗样式最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。
  • UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。

UDP的包头结构

Linux网络编程(一)—— TCP/UDP的区别与联系以及各自的使用场景_第2张图片

  • 源端口、目的端口: 16位,表示出本地和远端的端口号

  • 数据包的长度: 16位,包括包头和数据部分在内的行的字节数。因为包头的长度是固定的,所以该域主要用来表示护具部分的长度(又称为数据负载);

  • 校验和: 16位

TCP和UP的区别与联系


联系

  • 都是在传输层
  • 都是数据传输协议

区别

  • 1.基于连接与无连接;
  • 2.对系统资源的要求(TCP较多,UDP少);
  • 3.UDP程序结构较简单;
  • 4.流模式与数据报模式 ;
  • 5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证

**TCP支持的应用协议:**Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)。
**UDP支持的应用协议:**NFS(网络文件系统)、SNMP(简单网络管理系统)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。

协议的选择


协议的选择应该考虑到数据的可靠性、应用的实时性和网络的可靠性
选择TCP 的场景:

  • 对数据可靠性要求高
  • 对实时性要求不高
  • 网络状况不是很好的时候(如在广域网)

选择UDP 的场景:

  • 对数据可靠性要求不高
  • 对实时性要求高
  • 网络状况很好的时候,选择UDP可以减少网络的负荷

你可能感兴趣的:(网络通信,linux网络编程)