最近复习到网络,Linux的复习也将接近尾声。在这我将改正自己做事龙头蛇尾的一贯作风。在网络编程这个模块中也会认真做好笔记。
网络模块是一个面试必问的模块,这一块内容较多,但大多都是知识点,代码量就一个TCP和UDP的编程流程。
从这篇文章开始,我会将网络编程的知识点一一进行总结。
一下内容参考《计算机网络》(谢希仁)第五版。
目录
1.TCP协议的特点
tcp协议的主要特点如下:
- TCP是面向连接的的运输层协议。
这就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送完数据之后,必须对已建立的TCP连接进行释放。这就是说,应用程序之间的的通信好像在“打电话”;通话前先要拨号,打电话建立连接,通话结束后要挂断电话释放连接。
- TCP连接是点对点的。
每一条TCP连接只能有两个端点。但是一般在服务器上我们有不止一个客户端的请求,这时候就要建立多条TCP连接。
- TCP提供可靠交付的服务。
也就是说,通过TCP连接传送的数据,无差错、不丢失、不重复并且按序到达。
- TCP提供全双工通信
TCP允许通信双方的应用程序在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。应用程序在把数据发送给TCP的缓存后,就可以继续做自己的事情,而TCP在合适的时候会将缓存中的数据发送出去。在接收时,TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。
- 面向字节流
TCP中的“流”指的是流入到进程或者从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成式一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。例如发送方发送了10个数据块,而接收方仅用了4个数据块就将数据接收完成。这就式TCP协议的粘包问题。
tcp粘包问题我们可以通过两种方法解决。第一种,分次发送,不连续发送。第二种,在数据末尾加标识符进行区分。
总结:
TCP是面向连接的,可靠的流式服务。
在第一次进行交互之前,通过connect()函数进行连接,当connec发起连接的时候,会执行臭名昭著的“三次握手”来进行连接的建立。同时TCP协议有应答确认和超时重传机制,数据丢失可以重发,并且报头中带有序列号,也不怕乱序和重复报文的出现,此外还有滑动窗口进行流量控制,不会出现发送过快的情况。同时流式发送的特点为,数据依次发送,对方依次接收,发送的次数和接收的次数可以不一致。
tcp字节流服务如下图所示:
2.UDP协议的特点
- udp是无连接的
数据发送之前不需要建立连接,发送完毕之后也没有连接可以释放,因此减少了开销和发送数据之前的时延。
- udp使用尽最大努力交付
即udp不保证可靠交付,因此主机不需要维持复杂的状态表。
- udp是面向报文的
发送方的udp对应用程序交下来的报文,在添加首部后就向下交付给IP层。udp对应用层交下来的报文,既不进行合并,也不进行拆分,而是保留这些报文的边界。这就是说,应用层交给udp多长的报文,udp就照样发送,即一次发送一个报文。
- 同时udp没有拥塞控制,支持一对一、多对一、一对多的交互通信,并且udp首部开销很小。
总结:
udp是提供无连接的,不可靠的数据报服务。
udp数据报服务如下图所示: