网络七层模型就是一个参考模型,也就是说有这么个七层的定义,就像是项目中的dao、service、controller三层架构一样,每一层都有自己的工作要干,互联网协议就按照不同的作用分为osi七层或tcp/ip五层或tcp/ip四层。
第一层:应用层。定义了用于在网络中进行通信和传输数据的接口
第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等
第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断
第四层:传输层。管理着网络中的端到端的数据传输
第五层:网络层。定义网络设备间如何传输数据
第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输
第七层:物理层。这一层主要就是传输这些二进制数
学习计算机网络时我们一般采用折中的办法,也就是中和OSI和TCP/IP的优点,采用一种只有五层协议的体系结构学习即可,这样既简洁又能将概念阐述清楚。
应用层,数据(加http协议等)—》传输层(包上tcp或者udp协议)—》网络层(包上ip协议)—》数据链路层(包上以太网协议)—》物理层
下面就开始详细介绍这个几层,并按如上流程进行演示,最好开一台服务器或者虚拟机,跟着一起操作感受一下,相信你会对OSI这几层以及各种协议有一个全新的认识
比如浏览器、qq微信都是属于应用层,准确的说是应用层客户端,访问的服务器就是应用层服务端。我们在浏览器发送的请求会被加上http协议传输到传输层。还有xftp、sqlyong等等会加ssh协议。
这些协议就是所谓的应用层协议,用来约定两个程序传输的格式、怎么加密的等等。不同的场景选择不同的协议来工作。
其后的传输层、网络层、网络接口层我们并不需要关心,因为这是操作系统内核帮我们做好的事情了。就像我们使用浏览器一样,http协议浏览器帮我们加好了,只需要输入域名就可以。
1.创建连接: 8就代表文件描述符,<>代表输入输出,然后指向了一个路径,但是操作系统内核会把这个路径转换成对百度的socket连接
exec 8<> /dev/tcp/www.baidu.com/80
创建socket之后,cd到/proc目录下
这个目录下是内核程序运行时我们能在文件系统看到的东西,可以看到目录中有很多数字的目录,可以把他们想象成线程号一样。
如下命令就是查看当前执行进程的进程号,相当于查看当前运行的线程了。
echo $$
可以看到当前的进程号就是5725,那么进入5725
可以看到一些目录,这个fd就是前面说的文件操作符了,再cd进去,ll查看
0代表标准输入,1代表标准输出,2代表报错,下面的8就是我们刚才创建的socket,指向的百度。
那么我们现在其实就是应用层客户端,我们已经有了应用服务端百度的连接,那么我现在应该遵循某种协议,给百度发一些信息,让百度把主页返回给我们。现在很明显我们应该遵循HTTP协议。
2.发送请求: 请求的HTTP协议规范为 “GET / HTTP/1.0\n”,最后\n就是换行符,-e代表识别换行符,>代表会写到文件中,>&就代表会写到文件描述符中。
echo -e "GET / HTTP/1.0\n" >& 8
通过执行上面命令,就会把“GET / HTTP/1.0\n”通过8号文件描述符发送给百度,我们8号文件描述符的这个socket连接是双向的,可输入输出,那么百度就会把主页的信息放到socket中,我们只需要把8文件描述符的数据输入重定向出来,就可以看到百度主页的信息了
cat <& 8
上面我们干的其实就是一个应用层做的事,传输层网络层我们是无感的,因为系统内核已经把TCP协议的事做了,后面我们继续深入研究系统内核怎么做的TCP协议。
我们想一下刚才就做了两步,通过exec建立连接,发请求。那么怎么从应用层到的传输层、网络层的呢,其实太明显了,传输就是socket做的嘛,所以exec创建socket时就是调用了内核的传输层才建立的socket。
传输层就是把一台计算机的数据传输到另一台,基于的协议可以是TCP或者UDP,TCP是面向连接并可靠的协议,那么什么叫面向连接还可靠的呢,他要通过三次握手,四次挥手来保证它的连接的可靠性,以及滑动窗口的概念,这个后面再说。
什么是三次握手呢,其实就像下图一样,由客户端这边的传输层创建了一个sync数据包发给服务端,代表我想和你建立握手,服务端如果能收到这个包,一般服务端的传输层会给客户端回一个sync+ack确定包,最后客户端还得再给客户端回一个确认包,这样就通过三次握手建立了连接。
再来解释一下为什么需要三次握手,我们建立的socket这种网络通信是双向的,也就是客户端也发送有接收,服务端也有接受和发送,我们就需要让客户端和服务端都必须确定自己的接收和发送的是通的,那么最少需要三次,才能确定一个可用的socket。
一旦双方通过三次握手确认了自己的输入输出没有问题,这时候怎么建立连接呢,连接并不是一个实质性的连接,而是双方专门开辟出一块资源,这个资源有可能是一个进程,也可能是java当中一个线程,它是专门为对方而准备,然后就可以完成后面后续的通信过程,这就是所谓的面向连接。
如下这段代码其实就是开启一个socket,然后如果有客户端连接进来,等三次握手成功了,就能通过socket对象的accept方法拿到连接,然后开启个线程处理它,进而完成后续的数据读取与写入。
当双方完成交互,要做的事情干完了,就要断开连接,断开连接其实就是释放开辟的资源。那我们断开是想断开就能断开嘛,并不能,因为我们的资源是为对方服务的,所以需要对方知道并且同意了我们才能断开。
如上图,假如是客户端想断开,那么客户端的传输层会创建一个Fin数据包,服务端收到后,会回送一个ACK包,回的意思是我知道你想断开了,但是并没有同意断开呢,服务端还需要再发送一个Fin数据包,代表我同意断开了,客户端再回一个我收到了。俩次的断开都是各自发出的,以保证双方安全的释放掉资源。
如果超时了或者其他原因导致没有完成四次分手,那么时间过了,太久没响应,自己也会把资源释放掉了。
这时候其实对网络通讯已经比较了解了,那么我们再来想一个问题,比如我们浏览器打开十个标签页,搜索不同的东西,为什么搜索的结果没有传乱了呢,可以想到他们每个标签都是不同的连接,不同的socket,那么大家对socket的认知恐怕只知道他是一个套接字。
其实可以把他理解为“Ip-port ip-port”,两台计算机的ip和端口组成唯一映射关系。这个在Linux系统当中也可以体现出来
输入命令,netstat代表网络状态, n就是忽略地址到ip的翻译,a就是所有,t就是tcp,p就是显示id号和进程
netstat -natp
前面的是本机的ip和prot,后面的是对端的ip和prot,这一对就可以理解为套接字socket,我们还可以注意一下第一列,端口号的22,并且还是sshd协议,LISTEN状态,就代表这个程序是一个Server服务端,开始监听我的22端口有没有人连接。
下面我们干一个有趣的事。
我们开启三个标签,创建了三个连接,是不是和刚才说到的浏览器标签是一样的感觉,那我们找到这三行进行对比
Linux服务器本机的ip地址和端口完全一样,这时候的对端就是连接服务器的window了,因为是同一台windows连接的服务器,所以ip相同,但是可以发现端口号不同,打开的标签页都和windows申请了唯一的随机端口号,最终可以区分这几个socket。
但是端口是数量有限的(0-65535),所以事情做完会断开连接释放资源,释放端口号。
补充:一台服务器可以启动两个tomcat,但是服务端的两个tomcat不能同时使用8080,其实这也符合前面说的一切皆文件,两个tomcat就是两个进程,我们的请求到主机了,主机就可以根据不同的端口号的映射找到目标进程
传输层会帮我们做三次握手,创建数据包,但是是在网络层发出去的。也就是在创建握手包之后他是调向网络层的,网络层对应的就是IP协议了。
这里要说到一点就是经常会把TCP/IP说到一起,这个TCP/IP其实指的就是OSI模型,OSI的应用层对应HTTP、SSH等,传输层对用TCP,网络层对应IP,所以叫做TCP/IP,说的就是OSI模型了。
IP是互联网所有设备唯一标识的ID,网络层就是通过IP寻找到对方的路由路径,这时候我们考虑全球那么多IP,应该怎么去找到目标IP,在互联网里也是层级关系的,也就是先有小网也就是我们局域网,后有大网就是我们的互联网。从互联网中找到局域网,在从局域网中找到目标IP。所以我们IP中相当于有两个信息,一个是自己的名字,一个是归属于哪个局域网。
首先查一下我们ip信息
ifconfig
打开网卡配置文件,if是interface,cfg是config,eth就是以太网,0就是第一块网卡
vi /etc/sysconfig/network-scripts/ifcfg-eth0
可以看到上面有device是eth0这个设备,硬件地址、开机启动等等,最下面两个DNS是做域名向地址的解析。但是传输层创建的数据包,封的是ip,不是域名,这点需要知道,然后主要看我们下面的三行。
第一行是IP地址,第二行是子网掩码,第三行是网关。
这块需要了解二进制和十进制,不懂的百度一下吧,很简单。
我们先说IP和掩码的关系,IPV4是点分字节,也就是一个点两侧分别是一个字节Byte,一个字节有8个二进制位。
所以我们常说IPV4是32位的就是4*8(IPV6是128位),一个字节有8个二进制位那么最大就是11111111,最小00000000,二进制转十进制,11111111转为十进制就是255,也就是0-255。
IP清楚以后看掩码,掩码是三个255一个0,掩码和IP之间有个运算关系,叫做二进制的按位与运算,按位与运算就是全1为1,有0则0。
即(0&0=0; 0&1=0; 1&0=0; 1&1=1)
那么每一位做比较,192的二进制是11000000,255的二进制是11111111,所以得到的还是11000000,14的二进制和0的二进制做与运算得到的是0
也就是拿IP和掩码做完运算得到的是192.168.150.0,算出的192.168.150.0就是这台计算机所在的局域网,如果其他计算机能找到192.168.150这个局域网就能找到14号机。
然后我们先抛开GATEWAY网关,继续说IP,IP协议这层对应着一个路由表,我们可以想一下现在这个世界当中,手机,笔记本,台式机都是可以联网的,他们之间可以互相通讯,那么怎么手机怎么连接到服务器呢,互联网怎么互联的呢?
这里补充个知识点,比如我们ping了以下百度,他能在三四毫秒就能找到百度,我们读硬盘来读文件,磁头寻址读到目标文件的时间也是毫秒级别,我们再回想之前说的冯诺依曼体系,我们的硬盘、网卡都是输入输出设备,那么我们可以得出一个结论:在计算机系统当中IO是个瓶颈,他的延迟是毫秒级,因为内存的寻址时间是纳秒级别,内存比一切IO快了十万倍,所以说IO就是计算机系统中的瓶颈,从时间就是可以算出来。
说回来,毫秒对于人的体感来说已经足够快了,那么如何在这个庞大的互联网中快速的寻找到要访问的地址呢,其实在TCP/IP协议诞生的时候就解决了这个问题。通信很快但是它受到了学术界的抨击和质疑,为什么呢,因为它是采用的下一跳的传输方式。
下一跳是个什么机制什么概念呢,就和上图是一样的,比如上图三台计算机,a连b,b连c,a想访问c,它会直接把数据包扔给b,但是a并不知道能不能找的到,但它只有b这么一个出口,所以a会直接把数据包丢给直连的b,b再丢给c,这样都只扔给和自己直连的机器,就这样一跳一跳的就能有可能跳到目标计算机,当然也有可能跳丢了,这也就是学术界质疑的点。
为什么会采用这种下一跳的机制呢,因为我们面向每台主机,它不需要知道全局,只需要知道一个出口就可以了,所以前面提到的路由表就是要去完成这个下一跳机制。
我们来人肉模拟一下数据包出入选址的过程:
Linux系统中输入查看路由表命令
route -n
我们注意看第一行的信息,它的目标地址或者终点是192.168.150.0,网关是四个0,掩码是三个255一个0,那么这条信息哪来呢,就是刚才看到的网卡配置文件,拿着IP和掩码做完运算得到了网络号,然后通过eth0这块网卡,就可以和自己所的在的192.168.150.0这个局域网里的任何机器通信,且不需要网关。
第二行不需要看,接着看第三行,第三行的目标地址是四个0,网关是192.168.150.2,掩码是四个0,代表什么意思呢,比如我在ping百度
百度的域名通过DNS转换成了61.135.169.125这么一个目标地址,也就是说这台服务器会封装一个数据包,这个数据包的目标ip地址就是了61.135.169.125,然后我们的数据包应该去找哪块网卡呢,下一跳跳哪去呢,其实会有一个路由判定的过程
只需要拿着目标地址61.135.169.125和路由表当中的每一行掩码位做按位与运算,然后和前边的网络号比,不一样不匹配相当于作废,继续对比一下条
这时想想路由表的最后一行很神奇,掩码和目标地址全都是0,那么用任何的ip地址都能和最后一条匹配上,这个就叫做默认网关条目,也就是访问任何的地址都会和这个条目匹配上,这个条目中还有一个网关是192.168.150.2,也就是我们要把这个数据包扔给192.168.150.2,它去做下一跳去
猜猜这个网关是谁,太明显了,他就是路由器嘛,我们的路由器就是我们的网关,我们把数据包扔给路由器,路由器也有自己的路由表,它扔给运营商,运营商再扔给城域网,城域网再扔给骨干网,最终扔到我们要访问的服务器上去,这就是下一跳的过程
那么我们访问同一局域网怎么访问的,比如我们ping自己局域网内的一台机器
拿ip和掩码做完运算就走路由表的第一条了吧,并且没有网关
最后这里还有一个点,比如我们要访问百度,得把访问百度的数据包扔给了网关,那么这时候的数据包里面的ip地址是放路由的ip地址还是百度的ip地址?我们放网关的ip的话,到了网关,网关就以为是给它的数据包,就不会再有下一跳了,但是放百度的ip,连网关都找不到。所以一层是不够的,这时候就得有了下一层——链路层。
前面几层都有协议,到了链路层也有协议,叫做ARP协议,它可以根据IP地址获取物理地址,到了这层会把访问百度的数据包外边再套一个包,再写一个地址,这个地址是根据网关的ip地址解析完的网卡硬件地址
arp -a
可以看到192.168.150.2这个IP地址在53:2b这块物理网卡上,那么链路层只需要把访问百度的数据包按照MAC地址(物理地址)就可以转发到路由器那块网卡上了,到了路由器它会再走它的路由判定,继续向外扔。但是会把MAC地址换成路由器的网关的MAC地址,让路由器也能找到下一跳。
所以网络层是端点地址,就是客户端服务端通信的地址,但是链路层的地址是下一跳下一跳这种节点间的地址,端点的地址是不会发生变化的,但是节点的地址是每跳一次都换成下一跳的MAC地址。
这就是由网络层和链路层组成的完整的TCP/IP下一跳机制。
arp这个表的数据怎么来的,服务器或者电脑刚开机的时候,arp这个表其实是空的,在从网络层到链路层,ip到了链路层从arp表中没有找到的话,会发送一个apr协议进行获取mac地址,用下面这张图做解释。
计算机1想访问计算机4,那么通过前面的知识,可以知道会通过网络层路由表匹配到路由器的ip地址,然后到链路层再封一个数据包,里面是目标ip地址也就是192.168.3.4,外面再套一个路由器的mac地址,就可以请求到路由器,再从路由器找到3.4。
但是如果mac表没有对应ip会怎么办呢,他会发一个arp请求,这个请求的目标mac地址为全F,请求到了交换机,交换机会把这个arp请求广播,广播到计算机2,计算机发现目标ip不是自己就把请求丢了,到了路由器,发现是自己,就会把请求收下,然后返回。如下图,请求的时候会带着源ip和mac地址,还有目标的ip和mac地址,所以请求可以从路由器返回到计算机3,这样计算机3就拿到了路由器的mac地址
这里还要补充一下,交换机是两层的,它具有学习能力,计算机1刚开始的时候发送了一个arp请求,这个请求肯定带着源ip和mac地址,所以交换机会把他记下来,在自己的1号机位或者1号端口他的mac地址是xx,这样在路由器返回请求的时候,请求到了交换机,就可以对比,发现mac地址在自己这里记过了,那就不需要广播了,可以直接给1号端口
到这里网通通讯的过程已经结束了,鄙人初学的时候觉得很难理解,经过了三四天的思想转变才想明白。下面通过抓包测试,来验证以下前面的通讯逻辑是否正确。
首先安装一个抓包工具
yum install tcpdump
安装完以后输入命令 -nn代表不显示逻辑名称,显示ip地址和端口号,-i代表抓的哪块网卡后面跟抓哪些包,所以我们抓arp包或者这个包的端口号是80,这样两个包,然后让它执行着
tcpdump -nn -i eth0 arp or port 80
然后再开打一个新的标签页去访问百度,这里需要有一点改动,因为arp这张表本来开机是空的,但是它自己会通过arp协议请求到MAC地址,所以为了看到完整的网络通讯过程,我们可以先把MAC地址信息删掉,再通过curl去爬百度的主页
arp -d 192.168.150.2 && curl www.baidu.com 80
这时候链路层arp初始化好了以后,链路层就可以和网络层一起配合着发送数据包了。
三次握手完毕以后,双方为对方开辟了资源。后续操作都携带.,也就是ack确认
在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大。
在一定时间内没有等待到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。
未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。这种情况也会导致发送端误以为数据没有到达目的地而重发数据。
这个步骤就是数据传输的过程,本地给服务器请求,服务器响应确认,服务器分批返回数据,本地收到数据响应确认,P就代表着,我的请求发完了,尽快执行,不要有缓存积压。
其实就是在这里有窗口的概念,目的是为了提高传输的效率和可靠性,下面说下这个窗口的概念以及刚才上面说的确认、重发机制
TCP 以1个段为单位,每发送一个段进行一次确认应答的处理。这样的传输方式有一个缺点,就是包的往返时间越长通信性能就越低。
为解决这个问题,TCP 引入了窗口这个概念。确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅地缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。如下图所示:
窗口大小就是指无需等待确认应答而可以继续发送数据的***值。上图中窗口大小为4个段。这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。
上图中的窗口内的数据即便没有收到确认应答也可以被发送出去。不过,在整个窗口的确认应答没有到达之前,如果其中部分数据出现丢包,那么发送端仍然要负责重传。为此,发送端主机需要设置缓存保留这些待被重传的数据,直到收到他们的确认应答。
在滑动窗口以外的部分包括未发送的数据以及已经确认对端已收到的数据。当数据发出后若如期收到确认应答就可以不用再进行重发,此时数据就可以从缓存区清除。
收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。这样可以顺序地将多个段同时发送提高通信性能。这种机制也别称为滑动窗口控制。
在使用窗口控制中, 出现丢包一般分为两种情况:
① 确认应答未能返回的情况。在这种情况下,数据已经到达对端,是不需要再进行重发的,如下图:
② 某个报文段丢失的情况。接收主机如果收到一个自己应该接收的序列号以外的数据时,会针对当前为止收到数据返回确认应答。如下图所示,当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,因此,在窗口比较大,又出现报文段丢失的情况下,同一个序列号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答,就会将其对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称为高速重发控制。
最终客户端把主页数据接受完,四次分手断开连接,网络通讯完成。
应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等等。我们把应用层交互的数据单元称为报文
运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。
传输控制协议TCP(Transmisson Control Protocol)–提供面向连接的,可靠的数据传输服务。
用户数据协议UDP(User Datagram Protocol)–提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)
网络层(network layer)负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP体系结构中,由于网络层使用IP协议,因此分组也叫IP数据报,简称数据报。
网络层的另一个任务就是选择合适的路由,使源主机运输层所传下来的分株,能通过网络层中的路由器找到目的主机
数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据报组装程帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)
TCP/IP(传输控制协议/网际协议) 是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP,以及http等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。所以完全可以把TCP/IP理解为它就是OSI网络模型
TCP是传输层协议, 主要解决数据如何在网络中传输,它是以二进制数据流的形式解决传输层的事,它能将信息分割成组,并在接收端将其重组,并且提供拥塞控制和流量控制机制,丢包时的重发控制,但是对于上层应用的开发极不友好,所以面向应用层的开发又产生了HTTP协议,TCP是面向连接的,通过三次握手保证通信可靠性
UDP也是传输层协议, 但不是面向连接的,不具有可靠性的数据报协议,也就说UDP不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务,UDP 无法进行流量控制等避免网络拥塞行为因此网络出现拥塞不会使源主机的发送速率降低。
甚至当包的到达顺序出现乱序时也没有纠正的功能。UDP支持一对一、一对多、多对一和多对多的交互通信,UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。也就是包总量较少的通信(DNS、SNMP等),视频、音频等多媒体通信(即时通信)
HTTP协议是一个基于请求和应答模式,存在于传输层之上的应用层协议,通常是基于TCP的连接方式,它本身是一个无状态,无连接的协议,每次连接只处理一个请求.服务器处理完客户端的请求,然后响应,并收到应答之后,就断开连接.这种方式可以节省传输时间
请求和应答模式
HTTP协议定义了web客户端如何从web服务器请求Web页面,以及服务器如何把Web页面传送给客户端.HTTP协议采用了请求/响应模型.客户端向服务器发送一个请求报文,请求报文包括请求的方法,url,协议版本,请求头部和请求数据.服务器以一个状态行作为响应,响应的内容包括协议的版本,成功或者错误代码,服务器信息,响应头部和响应数据
无状态
无状态是指协议对于事务处理没有记忆能力,这种方式的一个坏处就是,如果后续的处理需要用到之前的信息,则必须要重传,这样就导致了每次连接传输的数据量增大.好处就是,如果后续的连接不需要之前提供的信息,响应就会比较快.而为了解决HTTP的无状态特性,出现了Cookie和Session技术.
HTTP和tcp的区别
很多人会把http和tcp看作两种不同但是是同级的协议,注意不是这样的,http是要基于TCP连接基础上的,简单的说,TCP就是单纯建立连接,不涉及任何我们需要请求的实际数据,简单的传输。http是用来收发数据,即实际应用上来的。TCP是底层通讯协议,定义的是数据传输和连接方式的规范 HTTP是应用层协议,定义的是传输数据的内容的规范 HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP
socket: socket并不是一种协议,他是对复杂的tcp进行了封装。是针对TCP或UDP的具体接口实现,提供了在传输层进行网络编程的方法
到现在是把,通讯和协议都聊明白了,下一章会深度讲解IO模型,让你明白什么叫NIO、BIO、多路复用,可以关注我的公众号,里面有全部完整的文章