网络编程基础一

一、架构

两种常见的架构:C/S架构(客户机/服务器)和B/S架构(浏览器/服务器,也属于C/S架构的一种)。

  C/S架构优点:

  • 能充分发挥客户机的性能
  • 由于只有一层交互,因此响应速度较快,安全性高

  C/S架构缺点:

  • 用户群固定,需要下载客户端才能使用
  • 维护成本高

  B/S架构优点:

  • 客户端无需安装,有浏览器就行,跨平台
  • B/S架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强
  • 统一了应用的接口

  B/S架构缺点:

  • 跨浏览器问题
  • 在速度和安全性上需要花费巨大的设计成本

 

二、通信

网络编程基本上都是基于请求/响应方式的,即一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。

  MAC地址:物理地址,由网卡决定的,是固定且唯一的。在OSI模型中第二层数据链路层负责。

  IP地址:四位点分十进制,在计算机内部存储时只需要4个字节即可。在OSI模型中第三层网络层负责。标识了计算机在网络中的位置。可以使用IP或域名来标识网络上的一台设备

  域名:由于IP地址不方便记忆,给IP取一个字符的名字,IP和域名之间存在一定的对应关系。在网络中只能使用IP地址进行数据传输,所以在传输以前,需要把域名转换为IP,这个由DNS的服务器完成。

  端口:规定一个设备有216个,即65536个端口,每个端口对应一个唯一的程序。每个网络程序,无论是客户端还是服务器端,都对应一个或多个特定的端口号。由于0-1024之间多被操作系统占用,所以实际编程时一般采用1024以后的端口号。使用端口号,可以找到一台设备上唯一的一个程序

如果需要和某台计算机建立连接的话,只需要知道IP地址或域名即可,但是如果想和该台计算机上的某个程序交换数据的话,还必须知道该程序使用的端口号。

  环回地址:网络ID为127的IP地址,用于一台主机的客户端与服务器端通过TCP/IP进行通信或者本机进程间通信,127.0.0.1。

  交换机:是一种在通信系统中完成信息交换功能的设备。

  • 交换机的通信方式:广播、单播、组播
  • 交换机的传输模式:全双工,半双工,全双工/半双工自适应

  利用交换机的通信:源主机发送一个请求帧给交换机,其中包含自身ip地址、mac地址,目标ip地址;交换机广播这条消息给其他所有的主机;目标主机接收到消息后,比对ip,回复给交换机信息,其中包含自身ip地址、mac地址,目标ip地址、mac地址;交换机以单播形式返回给源主机。

  路由器:连接不同网段。路由则是通过互联的网络把信息从源地址传输到目的地址的活动。路由发生在OSI网络参考模型中的第三层即网络层。

  网关:一个网络连接到另一个网络的“关口”。要实现这两个网络之间的通信,则必须通过网关。类似于一个局域网的出口和入口。

  网段:一个局域网内的ip地址范围。

  子网掩码:指明一个ip地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码和ip地址进行与运算&得到网段。

  arp协议 :  通过目标ip地址获取目标mac地址的一个协议。

  OSI模型:

应用层(应用层、表示层、会话层) http协议、https协议、ftp协议  
传输层 tcp协议、udp协议 四层交换机、四层路由器
网络层 ip协议 路由器、三层交换机
数据链路层 arp协议 网卡、网桥、以太网交换机
物理层   集线器、网线、光纤

 

   socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对于用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。网络通讯其实就是Sokcet间的通讯,数据在两个Sokcet间通过IO传输。
  socket(套接字)有两个种族,分别是基于文件类型(AF_UNIX)和基于网络类型(AF_INET)
  TCP是可靠的、面向连接的协议、传输效率低全双工通信(发送&接收)、面向字节流。使用TCP的应用:Web浏览器、电子邮件、文件传输程序。
  UDP是不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统(DNS)、视频流、IP语音。

 

TCP/IP三次握手与四次挥手

  ACK:确认收到

  SYN:请求连接的一个标识

  FIN:请求断开的一个标识

三次握手:

  所谓“三次握手”就是TCP连接建立的过程,即需要客户端与服务端总共发送三个包(所以着重记忆这三个包就可以了)以确认连接的建立。

  通过“三次握手”保证了客户端与服务器建立的是双工连接,而可靠性是更多是通过重发机制实现的。

  在Socket编程中,这一过程由客户端执行connect来触发。

过程:首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源,将客户端加入等待链接队列。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

白话:一定是由客户端发起请求连接服务器;服务器回复接收到的请求,并要求连接客户端;客户端回复可以连接

 

 四次挥手:

  所谓“四次挥手”就是关闭TCP连接的过程,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认双方连接的断开。

  同样是保证TCP连接的全双工连接。

  在socket编程中,这一过程由客户端或服务端任一方执行close来触发。

 

过程:假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。TCP连接就这样关闭了!

白话:任意一方发起断开连接的请求:我想和你断开连接,我没有数据要继续发送了,但如果你有数据需要发送,我可以继续接收;服务器回复:我接收到你的请求了;服务器发送:我已经准备好断开连接了;客户端回复:收到你的信息,断开连接。

注意:当客户端进入time-wait后,如果2MSL时间内不在收到服务器端的fin报文,说明服务器端已经收到客户端的ACK应答报文,客户端socket进入closed状态。但是因为网络原因服务器未收到ACK,那么服务器会认为之前发送的的FIN,客户端没有收到,则会继续发送FIN报文,直到收到来自客户端的ACK报文。

 

问题:为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

 

问题:交换机和路由器的区别?

答:交换机的主要功能是组织局域网,经过交换机内部处理解析信息之后,将信息以点对点,点多对的形式,发送给固定端;路由器的主要功能:是进行跨网段进行数据传输,路由选择最佳路径。

 

 

posted @ 2019-11-19 20:04  eat&  阅读(...)  评论(...编辑  收藏