OSI 计算机网络7层模型
TCP/IP四层网络模型
传输层提供应用间的逻辑通信(端到端),网络层提供的是主机到主机的通信,传输层提供的是可靠服务。
TCP 中常说的握手指的是:连接的定义和连接的建立的过程。IP 协议是无连接的,但是 TCP 是有链接的。
端口:数据链路层依靠 mac 地址寻址,网络接口层依靠 ip 地址寻址,传输层依靠端口号寻址,端口就是应用层的各种协议进程和传输实体之间进行层间交换的地址。
端口号:标识不同进程的号码,16位,2的16次方个,只在本地有意义。一共有三类,一是保留端口,比如 ftp 是21,20,dns 是53,http 是80端口,smtp 是25等。二是登记端口,三是客户端端口号,也叫临时端口(前两者叫服务端端口)
套接字:主机 ip+端口号组成,只有通过 ip 地址和端口号,才唯一确定一个连接的端口。唯一的标识了网络里的某台主机中的某个应用进程。
udp :
用户数据报协议,实现的是无连接服务,无确认,不可靠的交付,开销小,时延短,没有拥塞控制,主要应用于实时应用,比如 ip 电话,qq,视频会议等。udp 数据报仅仅是 ip 数据报的一部分。
tcp
也就是传输控制协议,实现的是面向连接的服务,向上提供了一条全双工的可靠的逻辑信道,可靠交付,开销大,注意,tcp 的连接通道是逻辑 上的,对路由器不可见,类似虚电路。
tcp 连接的三段:
建立,传送,释放。连接的端点叫 socket(套接字),被唯一的通信两端点确定,采用的是 cs 架构(客户服务器模型),tcp 传输连接的建立采用的是三次握手(可以防止报文段在传输过连接建立中出错)。
tcp三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的。
***次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。
通过这样的三次握手,客户端与服务端建立起可靠的双工的连接,开始传送数据。
但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手。
***次握手:
在考试, a同学 和 b 同学是铁哥们,此时a 想抄b 的卷子上***个大题的结果。
a 就向 b 说悄悄话,小 b,我抄一下你的卷子的***个大题的答案,我算不出来了。此时结果有两种:
1、假如小 b 专心答题,没注意 a 的请求,那么,a 和 b 的沟通建立失败,也就是说 b 同学接受不到 a 同学传来的信息,沟通肯定是失败了。
2、假如小 b 听到了 a 的悄悄话,好了,说明***次对话(握手)成功了。说明 a 同学对 b 同学的请求,b 能接受到。
第二次握手:
小 b 听到了 a 的请求抄袭的信息,结果有两种:
1、假如 b 同学因为紧张,虽然听到了,但是听的内容比较模糊,不知道a具体是想抄袭哪道题,于是就索性的随便敷衍一句:我也不会。此时的a同学一听立刻生气了,还能不能做朋友了?算我看错你了!好的吧,a 和 b 的沟通失败。说明b 同学无法做出正确应答的情况下沟通失败。
2、假如b 同学听到且听清了a 同学的抄袭请求,于是乎,b 同学会做出正确的应答,并对 a说出了***个大题的结果,并且ab兄弟情深,b还怕a他抄不上。反问:a,你抄好了么?那么等价于第二次握手成功。通过前两次对话(握手)证明了b同学能听到且听清a同学说的话,并能对 a同学的请求,去做出正确的应答。接下来进行第三次握手。
第三次握手:
a 得到了 b 同学的正确的反馈,此时有两个结果:
1、假如a 同学很高兴,马上开始抄吧!a 就忘乎所以了,抄的飞起,结果没注意 b 同学的***那句话『你炒好了么?』,让人家小b 同学等回复等了好几分钟。b很失落,心说:好啊你,你抄到了,就忘了我了,得,我再也不管你了,***ab还是沟通失败。说明a 同学无法对 b 同学做出应答的情况下,ab沟通失败。
2、假如a 同学注意到了 b 的反馈和反问,于是 a 同学对 b 同学说:我抄好了。那么 ab 的第三次握手成功,ab已经建立起了愉快流畅的沟通渠道,接下来a 和 b 就可以继续愉快的去传递答案了。
通过第二次和第三次的握手证明:
a 同学能够听到听清 b 同学的话,并且a 同学对此,能做出正确的反馈。可见,ab进行有效的,愉快的沟通,那么这三次握手的过程是必须的。
同理对于TCP为什么需要进行三次握手,可以一样的理解:
实际上就是为了两边的请求都能被识别,所以逻辑上最少三次。为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(***次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。