初识TCP/UDP(传输层)
Posted retry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识TCP/UDP(传输层)相关的知识,希望对你有一定的参考价值。
一、初识TCP/UDP(传输层)
引言:TCP(Transmission Control Protocol),又叫传输控制协议,UDP(User Datagram Protocol),又叫用户数据报协议。两者都是是传输层协议,但他们的通信机制与应用场景不同。
1、TCP与UDP区别
特点 | TCP | UDP |
---|---|---|
传输方式 | 字节流 | 数据报 |
连接性 | 面向连接 | 面向非连接 |
可靠性 | 可靠 | 不可靠 |
传输效率 | 慢 | 快 |
- 面向字节流(TCP)
面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去 。
- 面向报文(UDP)
面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。
2、TCP相关介绍
工作机制:紧小细微型。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。在一个TCP连接中,仅有两方进行彼此通信。而UDP更像是发短信,将发送方所有的信息,将所有信息一股脑儿全扔到网络中。
可靠性(可靠)
1.当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。TCP有延迟确认的功能,在此功能没有打开,则是立即确认。功能打开,则由定时器触发确认时间点。
2.TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)
3.既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
4.TCP的接收端必须丢弃重复的数据。
5.量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。
传输效率(慢)
- TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间。
2.1、TCP传输过程
TCP建链三次握手过程
- 1、主机A通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B ,向主机B 请求建立连接,通过这个数据段, 主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。
- 2、主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事: 我已经收到你的请求了,你可以传输数据了;你要用哪佧序列号作为起始数据段来回应我 。
- 3、主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段:”我已收到回复,我现在要开始传输实际数据了 这样三次握手就完成了,主机A和主机B 就可以传输数据了。(没有应用层的数据,SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0)
TCP断链四次握手过程
- 1、当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求。
- 2、主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1。
- 3、由B 端再提出反方向的关闭请求,将FIN置1。
- 4、主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束。
1、ACK : TCP报头的控制位之一,对数据进行确认.确认由目的端发出,用它来告诉发送端这个序列号之前的数据段都收到了.比如,确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性。
2、SYN : 同步序列号,TCP建立连接时将这个位置1。
3、FIN : 发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这位置1。
3、UDP
工作机制:蛮干型。它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。因此,在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
可靠性(可靠)
- UDP协议是一种无连接的传输协议,排除信息可靠传递机制带来速度优势的同时,显然降低了可靠性的需求,也就是UDP协议无法得知其是否安全,完整到达的。此外,由于TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。
传输效率(慢)
- 与TCP协议相比,UDP协议排除了信息可靠传递机制,也就是减少了TCP协议中提供数据包分组、组装和排序的过程需要的时间消耗。其次,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。
4、TCP与UDP编程模型
* TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
* TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect()建立链接;
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
* UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接。
* UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接。
以上是关于初识TCP/UDP(传输层)的主要内容,如果未能解决你的问题,请参考以下文章