网络编程基础知识详解

什么是网络编程

网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。 现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。

OSI七层模型

1.应用层 用户的应用程序和网络之间的接口
2.表示层 决定访问网络介质的方式
3.会话层 使用权数据路由经过大型网络 相当于邮局中的排序工人
4.传输层 提供终端到终端的可靠连接 相当于公司中跑邮局的送信职员
5.网络层 允许用户使用简单易记的名称建立连接 相当于公司中收寄信、写信封与拆信封的秘书
6.数据链路层 协商数据交换格式 相当公司中简报老板、替老板写信的助理
7.物理层 用户的应用程序和网络之间的接口

TCP与UDP的区别

tcp是一种可靠的,面向连接,基于字节流的传输层通讯协议 eg:http,https,ftp协议 效率低
udp是一种不太可靠,无面向连接,基于数据包的形式传输,可能会丢包,eg:微信语音。 效率较高

TCP传输数据的时候三次握手,关闭连接的时候四次挥手

注:图片来源于网络
在这里插入图片描述
第一次:客户端向服务端发送码syn,随机产生一个数据包x到服务端,
第一次(白话):客户端问向服务端发送一个请求,问服务端在不在?
第二次:服务端收到请求后,确认ack=x+1,于是就想客户端发送syn和ack
第二次(白话):我在
第三次:客户端收到服务端的ack,向服务端发送ack=y+1,之后建立连接
第三次(白话):收到,那我们建立连接。
注:图片来源于网络
在这里插入图片描述
第一次:客户端发送关闭连接,FIN,客户端进入关闭等待状态,
第二次:服务端收到FIN后,发送ack给客户端,服务端进入关闭等待状态
第三次:服务端发送一个FIN,用来关闭服务端到客户端的数据传输,服务端进入最后确认状态
第四次:客户端收到fin后,客户端进入到时间等待状态,然后发送ack给服务端,确认序号为收到序号+1,服务端进入关闭状态。挥手结束。

客户端为啥要等待2ms

为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。
2MSL时间可以保证本次连接所有报文失效,防止“已失效的连接请求报文段”出现在本连接中,避免被服务器端认为是一个新的连接请求。

网络编程需要了解的还有很多,大家一起加油

猜你喜欢

转载自blog.csdn.net/baidu_39170202/article/details/121324463