在近期学习计算机网络的过程中,由于知识点过于零散,琐碎,从而学习起来痛苦不堪,此贴只是总结了基于传输层的TCP协议相关的知识细节,并加入一点自己的理解,并无创新,若有理解不当之处,敬请提出,感谢!
首先过一下流水账,在计算机网络中,对于网络传输有七层模型,或者TCP/IP四层模型等等,那么先基于TCP/IP四层模型而言:
1.数据链路层:对0和1进行分组,定义了数据帧,确认主机物理地址,并且传输数据
2.网络层:定义IP地址,确认网络位置,通过IP给MAC寻址,对外网数据包进行路由转发
3.传输层:定义端口,确认主机上进程身份,并且把数据包交给对应的进程(利用socket)
4.应用层:定义数据格式,并且按照格式解读数据
在基于传输层中,有很多协议规定了如何去传,如何去收,比如UDP协议,这是一个基于报文(添加了标记,封装后的数据)的传输层协议,但是由于UDP没有确认机制,第一,发送前并不知道双方是否连接成功,第二,一旦数据包发送,无法知道是否收到,可靠性差,这个时候TCP协议就诞生了,简单的来说就是有确认机制的UDP协议(当然UDP协议中有很多的优势,比如传输速度快,可广播,组播等,在具体应用中二者相辅相成,具体根据实际项目来定)
一、
TCP是一个面向数据流的协议,UDP是一个面向数据报文的协议,这句话我相信老师经常会说,但是并没有具体解释是什么意思(反正我是)
1.TCP
我们先假设有一个蓄水池,可以在里面接水和倒水,但是倒水和接水这两者没有必然的关系,可以倒一次水然后分五次接完;接多少水,水池里就少多少水,倒多少水,水池里就多多少水,但不能超过蓄水池的容积,不然水就会溢出,结合TCP来看,水池就好比内核中的接收缓冲区,倒水就好比发送数据,接水就好比接收数据,好比你通过TCP连接给另一端发送数据,你只调用了一次write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。但是,你发送的数据量不能大于对方的接收缓存(流量控制),如果你硬是要发送过量数据,则对方的缓存满了就会把多出的数据丢弃。
2.UDP
UDP和TCP不同,发送端调用了几次write,接收端必须用相同次数的read读完。UPD是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。也就说,如果不指定MSG_PEEK标志,每次读取操作将消耗一个报文。
这种的区别是由TCP和UDP的特性所决定的,TCP是面向于连接,也就是说,在连接持续的过程中(连接三次握手,断开四次挥手),socket中收到的数据都是由同一台主机发出的(消息截获什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。
而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的。
二、
1.TCP的发送缓冲区和接收缓冲区
TCP协议的传输的端对端,一对一的,那么就会有发送端和接收端,在操作系统有两个空间即user space和kernal space。每个Tcp socket连接在内核中都有一个发送缓冲区和接收缓冲区,TCP的全双工(是指交换机在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音)的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。在编程中,一个socket的两端都会由send和recv两个函数,比如Client发送数据到server,那么就是客户端调用send发送数据,但是Send函数的实际作用只是把数据拷贝到socket的内核发送缓冲区中,然后send函数就会返回,send函数仅仅是把应用层buffer的数据拷贝到socket的内核发送buffer中,发送都是纯由TCP来做,和send没有关系(不要被Send的名字给蒙骗了),接下来数据发送到服务器端后,等待recv()进行读取,大家能够猜到了吧,recv函数也仅仅是把socket内核中的接收缓冲区中的数据拷贝到应用层的buffer里而已,如果应用程序一直没有调用recv()进行读取的话,此数据就会一直在相应socket的接收缓冲区内。对于TCP,如果应用进程一直没有读取,接收缓冲区满了之后,发生的动作是:收端通知发端,接收窗口关闭(win=0)。这个便是滑动窗口的实现。保证TCP套接口接收缓冲区不会溢出,从而保证了TCP是可靠传输。因为对方不允许发出超过所通告窗口大小的数据。 这就是TCP的流量控制,如果对方无视窗口大小而发出了超过窗口大小的数据,则接收方TCP将丢弃它。
2.TCP的流量控制机制
根据上面来看,TCP的流量控制机制是通过滑动窗口进行实现的,大致原理图如下,更多的细节可以参考TCP/IP详解这本书,
ACK:表示回复 SYN:请求连接 win:表示可用窗口
未完待续。。。