OSI(Open System Interconnect)七层模型
OSI中的层 | 功能 | TCP/IP协议 |
---|---|---|
应用层 | 文件传输,电子邮件,文件服务,虚拟终端 | HTTP, FTP, SFTP, DNS, Telnet, TFTP, SNMP |
表示层 | 数据格式化,代码转换,数据加密 | 没有 |
会话层 | 解除或建立与其他节点的联系 | 没有 |
传输层 | 提供端对端的接口 | TCP, UDP |
网络层 | 为数据包选择路由 | IP, ICMP, RIP, OSPF, BGP, IGMP |
数据链路层 | 传输有地址的帧,错误检测功能 | SLIP, CSLIP, PPP, ARP, RARP, MTU |
物理层 | 以二进制数据形式在物理媒体上传输数据 | ISO2110, IEEE802, IEEE802.2 |
TCP/IP五层模型的协议
TCP/IP层 | 网络设备 |
---|---|
应用层 | |
传输层 | 四层交换机、也有工作在四层的路由器 |
网络层 | 路由器、三层交换机 |
数据链路层 | 网桥(现已很少使用)、以太网交换机(二层交换机)、网卡(其实网卡是一半工作在物理层、一半工作在数据链路层) |
物理层 | 中继器、集线器、还有我们通常说的双绞线也工作在物理层 |
TCP/UDP协议
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。
- TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送。
- UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。
简述比较:
UDP在传送数据之前不需要先建立连接。远地主机的运输层在收到UDP报文后,不需要给出任何确认,虽然UDP不提供可靠交付,但在某些情况下UDP确实一种最有效的工作方式。
TCP则是提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。由于TCP要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多开销,如确认、流量控制、计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多的处理器资源。
TCP支持的应用协议主要有:Telnet、FTP、SMTP等;
UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
TCP/IP协议与低层的数据链路层和物理层无关,这也是TCP/IP的重要特点。
用户数据报协议UDP
主要特点
UDP是无连接的,即发送数据之间不需要建立连接,因此减少了开销和发送数据之前的时延。
UDO使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态。
UDP是面向报文。发送方的UDP对应用程序交下来的报文在添加首部后就向下交付给IP层,对交下来的报文既不合并也不拆分。因此,应用进程必须选择合适大小的报文,若报文太长,UDP把它交付给IP层后,IP层在传送时可能要进行分片,这会降低IP层的效率;反之,若报文太短,UDO把它交给IP层后,会使IP数据报的首部的相对长度太大,也降低了IP层的效率。
UDP没有拥塞控制,保证了应用的实时性。
支持一对一、一对多、多对一和多对多的交互通信。
UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短
UDP首部的格式
UDP有数据字段和首部字段两个字段。首部字段只有8个字节,分别为源端口、目的端口、长度和检验和。检验和用于检测UDP用户数据报在传输中是否有错,有错就丢弃。
当运输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口上交给进程。如果接方UDP发现收到的报文中的目的端口不正确就丢弃报文,并由ICMP发送“端口不可达”差错报文交给发送方。
在计算检验和时,要在UDP用户数据报之前增加12个字节的伪首部。“伪首部”并不是用户数据报真正的首部,只是在计算检验和时,临时添加在UDP数据报前面,得到一个临时UDP数据报。伪首部既不向下传送也不向上递交,仅仅是为了计算检验和。
UDP典型应用
- UDP适合于这样的进程:需要简单的请求-响应通信,而较少考虑流量控制和差错控制。对于需要传送成块数据的进程(如FTP)则不适合使用UDP。
- UDP适合于具有内部流量控制和差错控制机制的进程,如简单文件传输协议TFTP。
- 对多播来说,UDP是一个合适的传输协议。
- UDP常用于交互实时应用,以避免接收报文之间的不一致延时。
- UDP可用于管理进程,如SNMP。
传输控制协议TCP
主要特点
TCP是面向连接的运输层协议。应用程序在使用TCP协议之前,必须先简历TCP连接。在传送数据完毕后,必须释放已经简历的TCP连接。
每一条TCP连接只能有两个端点,只能是点对点的。
TCP提供可靠交付的服务。TCP连接传送的数据保证无差错、不丢失、不重复、并按序到达。
TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
面向字节流。虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据看成是一连串的务结构的字节流。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如,发送方应用程序交给发送方TCP共有10个数据块,但接收方TCP可能只用了4个数据块就把收到的字节流交付给了上层应用程序)。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
TCP的连接
每一条TCP连接有两个端点,而TCP的端点叫做套接字(由端口号拼接到IP地址形成的),套接字的表示方法是在点分十进制的IP地址后面写上端口号,中间用冒号或都好隔开。
套接字Socket = (IP地址: 端口号)
每一条TCP连接唯一的被通信两端的两个套接字所确定:
TCP连接::={socket1, socket2} = {(IP1:port1), (IP2:port2)}
TCP报文的首部格式
TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段。一个TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它首部中各字段的作用。因此,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。TCP报文首部固定部分各字段的意义如下:
- 源端口和目的端口
各占两字节,分别写入源端口号和目的端口号。TCP的分用也是通过端口实现的。 - 报文段序号
占4字节。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置,首部中的序号字段值则是指本报文所发送的数据的第一个字节的序号。 - 确认号
期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则表明到序号N-1为止的所有数据都已正确收到。 - 数据偏移
指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,实际上指出了TCP报文段的首部长度。 - 保留
保留为今后使用,目前应置为0. - 6个控制位
紧急URG:当URG为1时,表明紧急指针字段有效,告诉系统有紧急数据,应尽快优先传送。
确认ACK:TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
推送PSH,很少使用。
复位RST:当RST=1时,表明TCP连接中出现严重错误,必须释放连接,然后再重新建立运输连接。
同步SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使用SYN=1和ACK=1.
终止FIN:用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。 - 窗口
窗口字段明确指出了现在允许对方发送的数据量,该值经常在动态变化着。例如,设确认号是701,窗口字段是1000。这就表明从701算起,发送此报文段的一方还有接收1000个字节数据的接收缓存空间。 - 检验和
检验和字段检验的范围包括首部和数据这两部分。和UDP一样,在计算检验和时要在TCP报文段的前面加上12字节的伪首部。 - 紧急指针
紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。**即使窗口为零时也可发送紧急数据。 - 选项
可选选项有最大报文长度MSS、窗口扩大选项、时间戳选项、选择确认选项等
TCP连接的建立与终止
TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做四次握手。
TCP的建立
- 首先,客户端向服务器申请打开某一个端口(用SYN段等于1的TCP报文);
- 然后,服务器端发回一个ACK报文通知客户端请求报文收到;
- 客户端收到确认报文以后再次发出确认报文,确认刚才服务器端发出的确认报文。
至此,连接的建立完成。这就叫做三次握手。如果打算让双方都做好准备的话,一定要发送三次报文,而且只需要三次报文就可以了。如果再加上TCP的超时重传机制,那么TCP就完全可以保证一个数据包被送到目的地。
TCP的终止
建立一个连接需要三次握手,而终止一个连接要经过4次握手,这是由TCP的半关闭(half close)造成的。既然一个 TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个 FIN来终止这个方向连接。当一端收到一个 FIN,它必须通知应用层另一端几经终止了那个方向的数据传送。
客户机给服务器一个FIN为1的TCP报文,然后服务器返回给客户端一个确认ACK报文,并且发送一个FIN报文,当客户机回复ACK报文后(四次握手),连接就结束了。