分布式与网络互联尤为密切,而TCP/IP(传输控制协议/互联网络协议)是网络中最基本的协议。TCP/IP结合DNS、路由相关的协议最终实现的了网络的任意两点的数据通信问题。
想要解锁更多新姿势?请访问我的博客。
协议怎么分层的呢?
提到协议分层,我们很容易联想到ISO-OSI的七层协议经典架构,但是TCP/IP协议族的结构则稍有不同。
OSI七层网络模型 | TCP/IP四层概念模型 | 对应网络协议 |
---|---|---|
应用层(Application) | 应用层 | HTTP、TFTP, FTP, NFS, WAIS、SMTP |
表示层(Presentation) | Telnet, Rlogin, SNMP, Gopher | |
会话层(Session) | SMTP, DNS | |
传输层(Transport) | 传输层 | TCP, UDP |
网络层(Network) | 网络层 | IP, ICMP, ARP, RARP, AKP, UUCP |
数据链路层(Data Link) | 数据链路层 | FDDI, Ethernet, Arpanet, PDN, SLIP, PPP |
物理层(Physical) | IEEE 802.1A, IEEE 802.2到IEEE 802.11 |
TCP/IP协议族按照层次由上到下,层层包装。
最上面的就是应用层了,这里面有http,ftp,等等我们熟悉的协议。
第二层则是传输层,著名的TCP和UDP协议就在这个层次,我们熟知的网页大部分是由TCP传输的,而玩的游戏大部分是由UDP传输的。
第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据以确定传输的目标。
第四层是叫数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备。
TCP/IP四层协议与OSI七层网络模型层层相对,结构分明。
协议是什么样子的呢?
打开cmd(本人windows平台),输入运行ipconfig/all
这里就可以清楚的显示出来我PC的各种网路信息,甚至我PC几个网卡都能看的一清二楚。
传输过程
本地传输
如果我们浏览网页,通常会在浏览器地址栏中打上3个w和网站的名字,就譬如打开百度需要输入WWW.BAIDU.COM,这个名字就叫域名。我们的浏览器会发现url中网站的域名,然后查找本地的host文件,根据host文件查找响应的dns服务器ip地址,用UDP协议向dns服务器发送dns查询命令,dns服务器获取到查询命令并从缓存或者数据库中查询改域名对应主机的ip地址,再将这个ip地址发到你浏览器上。
有点绕口,实际你可以使用cmd的nslookup
来跟踪这个过程。
我们看到,使用多次命令查询,得到的ip结果总是不一样的。这是因为dns有负载均衡机制,服务器会查询并返回多个ip地址,每次查询返回的ip地址可能有所不同。
接着往下说,当我们浏览器获知这个ip地址的时候,就向这个ip地址的80端口(HTTP标准端口是80 ,而HTTPS的标准端口是443)发起TCP连接,但其实这个ip地址并不是计算机所在的局域网,而是一个广域网地址,所以子网的网关就需要通过路由转发了
路由
互联网是由很多相互隔离的小网络无限延伸而成的一个大网络,路由器负责将多个网络连接,并交换路由表信息来确定一个IP报文要经过哪个路由器的哪个端口发给哪个互联的子网。
为了防止一个数据包在发送过程中形成死循环,ip包中的TTL字段每经过路由器转发一次,就会-1。当TTL为0时则被丢弃,认为网络不可达,一般默认的最大TTL是30
同样我们可以使用tracert来跟踪这个过程。tacert是根据ICMP协议来确定一个ip报文到达目标地址所经过的路由器节点
Socket
socket时一个ip地址与端口的组合,是计算机的远程通信接口,本地一个socket与远程socket连接的过程,就是三次握手的过程。
三次握手
第一次握手:客户端发送syn包(SYN = 1,序列号seq = x,SYN报文段不能携带数据,但要消耗一个初始序号)到服务器,并进入SYN_SEND状态,等待服务器确认。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(SYN=1 ACK=1 seq=y,同样消耗一个序号),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK包 ,向服务器发送确认包ACK(ACK = 1 seq = x + 1 ack = y + 1,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,这种情况下,下一个数据报文段的序号仍是seq=x+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
各个状态名称与含义
CLOSED: 表示初始状态。
LISTEN: 服务器端处于监听状态,可以接受连接。
SYN_RECV: 当收到客户端的ACK报文后,服务器会进入到ESTABLISHED状态。
SYN_SENT: 当客户端发送SYN报文,随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。
ESTABLISHED:表示连接已经建立了。
四次挥手
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
各个状态名称与含义
FIN-WAIT-1:等待远程TCP的连接中断请求。
FIN-WAIT-2:从远程TCP等待连接中断请求。
CLOSE-WAIT:等待从本地用户发来的连接中断请求。
CLOSING:等待远程TCP对连接中断的确认。
LAST-ACK:等待原来发向远程TCP的连接中断请求的确认;
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
附录
常见端口
FTP 21
telnet 23
域名服务器 53
POP3 110
MySQL 3306
POP-2 109
SNMP 161
SSH 22
SMTP 25
HTTP 80
NTP 123
shell或者cmd 514
SQL Server 1433
结束
此片完了~ 想要了解更多精彩新姿势?
请访问我的个人博客 本篇为原创内容,已在个人博客率先发表,随后CSDN,segmentfault,掘金,简书,开源中国同步发出。如有雷同,缘分呢兄弟。赶快加个好友,咱们两个想个号码, 买个彩票,先挣他个几百万😝