浅谈TCP和UDP

目录

 

概念

UDP

TCP

相关socket编程

总结


概念

TCP 传输协议:TCP 协议是一TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。首先这里涉及到两个问题:

1.什么是协议?

网络协议是指通信双方就通信如何进行所必须共同遵守的约定和通信规则的集合。在网络上通信的双方只有遵守相同的协议,才能正确地交流信息,就像人们交谈时要使用同一种语言一样,如果谈话里使用不同的语言,就会造成双方都不知所云,交流就被迫中断。

2.传输层的作用?

传输层主要负责端对端的通信,也就是节点上的进程和其他节点的进程进行通信。要想通信可以成功,势必需要相应的协议,比较常用的就是TCP和UDP协议了,以下进行讲解。

UDP

1. 不可靠的

- 首先不可靠性体现在无连接上,通信都不需要建立连接,想发就发,这样的情况肯定不可靠。

- 并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。

- 再者网络环境时好时坏,但是 UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP。

2.无连接

每次发送带着servlet的信息(ip+port),不需要提前做准备工作,即不需要建立连接

3.面向数据报

发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文

TCP

1.可靠的

对于可靠传输,判断丢包,误码靠的是TCP的段编号以及确认号。TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。

2.有连接的

为了保证可靠的传输,在发送数据前,客户端和服务器会有一个连接的建立过程。

浅谈TCP和UDP_第1张图片

(1)客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。

(2)服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。

(3)客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。

三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

3.面向字节流

TCP不像UDP一样那样一个个报文独立地传输,而是在不保留报文边界的情况下以字节流方式进行传输。

相关socket编程

经过一定的练习,进行了总结:

1.基于TCP的socket:

  服务器端程序:

    ① 创建一个socket,用函数socket()

    ② 绑定IP地址、端口等信息到socket上,用函数bind()

    ③ 设置允许的最大连接数,用函数listen()

    ④ 接收客户端上来的连接,用函数accept()

    ⑤ 收发数据,用函数send()和recv(),或者read()和write()

    ⑥ 关闭网络连接close()

  客户端程序:

    ① 创建一个socket,用函数socket()

    ② 设置要连接的对方的IP地址和端口等属性

    ③ 连接服务器,用函数connect()

    ④ 收发数据,用函数send()和recv(),或read()和write()

    ⑤ 关闭网络连接close()

2.基于UDP的socket:

  服务器端流程

    ① 建立套接字文件描述符,使用函数socket(),生成套接字文件描述符

    ② 设置服务器地址和侦听端口,初始化要绑定的网络地址结构

    ③ 绑定侦听端口,使用bind()函数,将套接字文件描述符和一个地址类型变量进行绑定

    ④ 接收客户端的数据,使用recvfrom()函数接收客户端的网络数据

    ⑤ 向客户端发送数据,使用sendto()函数向服务器主机发送数据

    ⑥ 关闭套接字,使用close()函数释放资源。UDP协议的客户端流程

  客户端流程

    ① 建立套接字文件描述符,socket()

    ② 设置服务器地址和端口,struct sockaddr

    ③ 向服务器发送数据,sendto()

    ④ 接收服务器的数据,recvfrom()

    ⑤ 关闭套接字,close()

总结

TCP和UDP其实各有各的长处和短处,具体应用:UDP的主要应用场景:即时通信。面向数据报方式;网络数据大多为短消息;拥有大量客户端;对数据安全性无特殊要求;网络负担重但对响应速度要求高的场景。比如: IP电话、实时视频会议等。TCP的应用场景:对数据准确性要求高,速度可以相对较慢的。比如: 文件传输、邮件的发送与接收等。

 

你可能感兴趣的