计算机网络--TCP协议深入理解

  在近期学习计算机网络的过程中,由于知识点过于零散,琐碎,从而学习起来痛苦不堪,此贴只是总结了基于传输层的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:表示可用窗口

未完待续。。。

原文地址:https://www.cnblogs.com/xgmzhna/p/11505714.html

时间: 2024-11-10 16:16:51

计算机网络--TCP协议深入理解的相关文章

Http协议与TCP协议简单理解

在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解. TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的.所以Http连接是一种短连接,是一种无状态的连接.所谓的无状态,是指浏览器每次向服务器发起请求的时候,

iOS Http协议与TCP协议简单理解

在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解. TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的.所以Http连接是一种短连接,是一种无状态的连接.所谓的无状态,是指浏览器每次向服务器发起请求的时候,

Http协议与TCP协议简单理解(转)

在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解. TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的.所以Http连接是一种短连接,是一种无状态的连接.所谓的无状态,是指浏览器每次向服务器发起请求的时候,

一个例子加深对servlet与tcp协议的理解

理解一下servlet Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 理解一下TCP/IP协议 TCP/IP不是一个协议,而是一个协议族的统称.里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http.ftp.pop3协议等等.电脑有了这些,就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了. 通过代码加深一下印象. 客户端代码Cl

【转载】Http协议与TCP协议简单理解

在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解.TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的.所以Http连接是一种短连接,是一种无状态的连接.所谓的无状态,是指浏览器每次向服务器发起请求的时候,不

http协议与tcp协议的理解

1.区别 tcp协议是对应于传输层,http协议是对应于应用层,从本质上来说,二者是没有可比性的.http协议是建立在tcp协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发送一次http请求.http会通过tcp建立起一个到服务器的连接通道,当本次请求需要的数据完毕之后,http会立即将tcp连接断开,这个过程是很短的.所以http是一种无状态的短链接.所谓的无状态是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接.如果是一个连接的话,服务器进程中就能

【转载】Http协议与TCP协议简单理解后续

写了这么长时间的代码,发现自己对TCP/IP了解的并不是很透彻.虽然会用C#的HttpClient类来进行网络编程,也可以使用Chrome的开发者工具来检测每一次的HTTP请求的报文头与报文体,也知道cookie的存在方式,但是对于这些数据怎么在网络上传输还是很模糊,数据是怎么从客户端的文件或者字符串转换为二进制数并且传送到服务器端的?为了弄明白这些问题,最近大致的读了读<TCP-IP详解(卷一.二.三)>,也算是比以前清楚多了,下面是读的过程中的一些知识点. 首先,我们要弄明白这个计算机网络

Http协议与TCP协议

阅读文章: Http协议与TCP协议简单理解 Http协议与TCP协议简单理解后续 这两篇文章有点关系,可以先读第一篇,在读第二篇. 作者根据自己的一问去读书,然后慢慢尝试解释疑问.

TCP协议设计原理

  最近去了解TCP协议,发现这是一个特别值得深思的协议.在本篇博客中,不会长篇大论的给大家介绍TCP协议特点.包头格式以及TCP的连接和断开等基本原理,而是会带大家深入理解为什么要这么设计,如果不这么设计,会产生什么后果,希望能帮助大家对TCP协议的理解.TCP弥补了IP尽力而为服务的不足,实现了面向连接.高可靠性.报文按序到达.端到端流量控制. 面向连接 一提到TCP是面向连接的协议,必然是介绍其的3次握手和4次挥手,为了说明为什么需要三次握手和四次挥手,我们还是拿两个图来说明连接建立和断开