网络编程学习

目录

一、OSI、TCP/IP体系结构

二、OSI和TCP/ IP各层协议的功能

三、PING 的作用 

四、TCP建立连接的三次握手过程

五、TCP建立连接的过程为什么只是三次握手

六、TCP的四次挥手

 七、第四次挥手为什么要等待2MSL(60s)

八、TCP断开连接为什么是四次挥手

九、什么是粘包和拆包?发生粘包和拆包的原因

十、字节序

十一、TCP、UDP的区别

十二、IO模型

1、阻塞IO

2、非阻塞IO

3、IO多路复用

4、信号驱动IO

5、异步IO

十三、服务器模型

十四、广播和组播 

广播

组播

十五、sqlite3数据库

十六、IP地址分为五类


一、OSI、TCP/IP体系结构

        TCP/IP模型原为四层,而TCP/IP五层模型实际上是TCP/IP与OSI七层模型的混合后的产物。说到底,这些模型的出现目的是为了使大家都使用统一的协议(通信规则)来通信。可以看到,五层模型和七层模型在物理层、数据链路层、网络层、传输层都用的是相同的协议,他们是统一的。不同点只在于应用层部分。应用程序复杂多变,比如电子邮件用的是SMTP协议、WEB服务器用HTTP协议。应用程序可以根据自己的需求特点,来使用各种不同的协议。而五层模型和七层模型在应用层的理念各有优劣,也因此在不同的协议中得到实现

        TCP/IP协议是互联网协议(簇)的统称,他是互联网标准通信的基础,它提供点对点的链接机制,将数据应该如何封装、定址、传输、路由以及在目的地如何接收,都加以标准化。而OSI模型是开放式系统互联通信参考模型

OSI模型七层结构

TCP/IP四层和五层协议

TCP/IP和OSI对应关系


二、OSI和TCP/ IP各层协议的功能


三、PING 的作用 

PING 主要的作用就是测试在两台主机之间能否建立连接,如果 PING 不通就无法建立连接。

它其实就是向目的主机发送多个 ICMP 回送请求报文

  • 如果没有响应则无法建立连接
  • 如果有响应就可以根据目的主机返回的回送报文的时间和成功响应的次数估算出数据包往返时间及丢包率

四、TCP建立连接的三次握手过程

过程描述:

①首先 Client 端发送连接请求报文

②Server 段接受连接后回复 ACK 报文,并为这次连接分配资源。

③Client 端接收到 ACK 报文后也向 Server 段发生 ACK 报文,并分配资源,这样 TCP 连接就建立了。

总结:三次握手的关键是要确认对方收到了自己的数据包,这个目标就是通过“确认号(Ack)”字段实现的。计算机会记录下自己发送的数据包序号Seq,待收到对方的数据包后,检测“确认号(Ack)”字段,看Ack = Seq + 1是否成立,如果成立说明对方正确收到了自己的数据包 。


五、TCP建立连接的过程为什么只是三次握手

原因:

  1. 为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误
  2. 如果客户端连续发送多次 SYN 建⽴连接的报⽂,如果出现了网络拥堵,可能会有旧连接先于新连接到达的情况,就可能会出现连接覆盖,要避免这种情况,最少需要三次握手
  3. 三次握⼿正好避免资源浪费
  4.  三次握⼿就已经是理论上建立可靠连接的最小次数了,所以不需要更多的连接
  5. 同步双⽅初始序列号
  6. 同步序列号(可以鉴别重复数序,按序接受等)其实并不要三次握手,只要一来一回两次就可以了

三次连接通信过程分析:

1、第一次通信过程中,client向server发送信息,server收到信息之后可以确认client的发信能力和server的收信能力没问题。

2、在第二次通信过程中,server向client发送信息,在client收到信息后,可以确认server的收信能力和client的发信能力没问题,但是server不知道自己的发信能力如何,所以继续建立第三次通信。

3、在第三次通信过程中,client向server发送信息,server确认自己的发信能力没有问题。

总结:

        三次握手的过程主要就是为了确认client和server发送和接收的能力,即:双方做好发送数据的准备工作(双方都要知道),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

TCP的三次握手一定保证可靠传输嘛?

        三次握手肯定比二次握手更可靠,但也不是完全可靠(不存在所谓的完全可靠传输),但是追加更多次握手也不能提高保证,并且还会更加浪费资源,所以选择三次握手


六、TCP的四次挥手

        建立连接是其中很重要的一环,它是数据正确传输的前提。但是断开连接也是非常重要,它让计算机释放不再使用的资源。如果连接不能正确断开连接,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器的压力会变得很大。

过程分析:

C:工作结束,我申请断开连接

S:好的,等我做准备工作

等待。。。。

S:我准备好了,可以断开连接了

C:好的,(等待2MSL ---60s)断开连接

第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

第二次挥手:Server收到FIN后,发送一个ACK(应答)给Client,Server进入CLOSE_WAIT状态。

第三次挥手: Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次握手。


 七、第四次挥手为什么要等待2MSL(60s)

1、保证连接被正常关闭

2、保证旧链接的信息被清除

        首先 2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果在 TIME-WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报文,那么 2MSL 时间会被重置。

 等待2MSL的原因如下:

1、等到原来连接的数据包消失

        如果server没有收到client的ACK,会超时重传FIN,client再次接到重传的FIN,会再次发送ACK。

        如果server收到client的ACK,也不会再发消息

        在最后一次挥手后 client并不知道 server 是否接到自己的信息

        包括 ACK 是以上哪两种情况,client 都需要等待,要取这两种情况等待时间的最大值,以应对最坏的情况发生,这个最坏情况是:去向ACK消息最大存活时间(MSL) + 来向FIN消息的最大存活时间(MSL)。这刚好是2MSL,这个时间,足以使得原来连接的数据包在网络中消失。

2、保证ACK能被服务器端接收从而正确关闭连接   

        因为这个 ACK 是有可能丢失的,会导致服务器收不到对 FIN-ACK 确认报文。假设客户端不等待 2MSL ,而是在发送完 ACK 之后直接释放关闭,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值