Learning hard 网络编程
1.1网络分层总览
网络上的计算机之所以可以互相通信,是因为它们都遵守着公认的互联网协议,就如同人与人的交流一样,两个人能够交流,就必须知道对方的语言,计算机的网络通信可归结为网络中层与层之间的通信,OSI(Open System Interconnection)模型把网络通信分成7层,物理层,数据链路层,网络层,传输层,会话层,表示层,应用层,
为了容易理解,网络应用开发人员一般将网络分成5层,物理层,数据链路层,网络层,传输层,应用层,
各层的主要功能,
物理层,负责二进制流的传输,为数据链路层提供一个传输比特流的物理连接,
数据链路层,提供介质访问,加强物理层的输出功能,建立一条无差错的传输路线,
网络层,网络层提供IP寻址和路由选择的功能,因为在网络上,源主机和目的主机可以处在同一个网络中,也可以分散在不同网络中,在由多网络组成的互联网中,会存在多条可以将源主机与目的主机连接在一起的通信线路,网络层的功能就是在这些线路中找出最佳的传输线程,
传输层,传输层为源主机和目的主机的通信提供了数据传输服务,它隔离了网络的上下层协议,使得网络应用与下层协议无关,
应用层,应用层提供面向用户的网络服务,如文件传输服务和远程登陆服务等,不同用户对应用层服务的需求也不一样,所以应用层定义了许多不同的协议,比较常用的有文件传输协议(FTP),超文本传输协议(HTTP),域名解析协议(DNS),简单邮件传输协议(SMTP)和邮局协议(POP3)等,
1.2各层所使用的协议
网络中的计算机互相通信就是实现了层与层之间的通信,为此,各层都要遵守规则以便更好的完成通信,我们把它们之间遵守的规则称作“协议”,
物理层协议,
物理层是五层模型中的最底层,它为计算机之间的数据通信提供了传输媒体和互连设备,为数据传输提供了可靠的环境,其中,媒体包括电缆,光纤和无线信道等,互联设备则指计算机和调制解调器之间的互联设备,如各种插头,插座等,该层的作用是透明的传输比特流(即二进制流),为数据链路层提供一个传输原始比特流的物理连接,
数据链路层协议,
数据链路层是模型中的第二层,该层对物理层传输过来的比特流进行分组,由一组电信号构成的数据包称作“帧”,数据链路层传输的就是以“帧”为单位的数据包,数据链路层最终会把数据包传递给网络层,
字节,如果数据过长,则必须分割成多个帧后在进行发送,
网络层协议,
该层通过寻址(寻址地址 )来建立两个节点之间的连接,大家知道,电脑连接上网络后都有一个IP地址,通过它我们可以确定不同的计算机是否在同一个子网络上,连接上网络的电脑有两种地址,一种是物理地址,另一种是网络地址,也就是IP地址,要想与网络上的某个计算机进行通信,首先需要用网络地址判断它是否与你的电脑处于同一个子网络,然后在对物理地址(MAC地址)进行处理,从而准确的确定要通信的计算机的位置,
网络层使用的是IP协议,目前广泛采用的是IP协议第4版(IPv4),这个版本规定网络地址由32位二进制位组成,你可以自己配置IP地址,也可以通过自动获得的方式来获得IP地址,IP地址分成两部分,前24位代表网络,后8位代表主机号,例如192.168.254.1和192.168.254.2就处于同一个子网络里,因为这两个IP地址的前24位是相同的,
网络层是以IP数据包的形式来传递数据的,IP数据包同样包括两部分,头(Head)和数据(Data),而且IP数据包是被放进帧数据包中的帧数据部分进行传输的,
传输层协议,
通过MAC和IP地址,你可以找到互联网上任意两台主机来建立通信,但这里有一个问题,主机上使用网络的程序有很多,比如当你一边听歌一边用QQ聊天时,如果网络上发送来一个数据包,主机如何知道它是用于聊天还是用于歌曲的呢,这时需要一个参数,来标识出该数据包是供哪个程序(进程)使用的,这个参数就是端口号,主机用端口号来标识不同的程序(进程),端口号是一个0到65535之间的整数,其中从0到1023的端口号已被系统占用,用户只能选择大于1023的端口号来标识程序,
网络层建立的是主机与主机之间的通信,而传输层则建立了端口与端口之间的通信,这样一旦确定了主机和端口号之后,你就可以实现程序之间的通信了,
传输层有两个非常重要的协议,UDP协议和TCP协议,
采用UDP协议进行通信时,传输的是UDP数据包,这种数据包也是由头和数据两部分组成的,头部分主要用来标识发送方和接收方的端口号,而数据部分则是具体的内容信息,UDP数据包被放在IP数据包中的数据部分,而IP数据包则进一步被放在了帧数据包中的帧数据部分进行传输,
UDP协议的可靠性差,它无法确定对方是否接收到数据,为保证可靠传输,我们可使用TCP协议完成通信,它通过3次握手的方式确保了数据的可靠传输,
应用层协议,
应用层是模型的最顶层,是用户与网络的接口,该层通过应用程序来满足网络用户的应用需求,应用层的数据被放在了TCP数据包的数据部分,该层定义了一个很重要的协议,HTTP协议,一般的Web应用都是基于应用层开发的,
1.3网络程序的工作机制
网络程序与传统单机程序有明显区别,网络程序够与网络上其它计算机中的程序进行通信,
网络上要与其它计算机进行通信,首先需要知道计算机的网络地址,Internet使用IP地址来标识计算机的网络地址,使用端口号来识别不同计算机上的进程,即通过“IP地址+端口号”的方式就可以唯一标识网络上特定计算机的特定进程,
除了需要知道通信程序的地址之外,网络通信也需要一定的规则,我们称之为“协议”,主机A中的程序和主机B中的程序只有采用了同样的协议,它们之间才可以正常通信,
地址有了,通信协议也有了,就可以使用套接字(Socket)来进行通信了,
IP地址,
互联网中,每台计算机(主机)都必须有一个唯一的IP地址,IP地址一般为32位(即4个字节/1个字节等于8位)大小,采用点分十进制的格式来表示,例如192.168.1.10,每个字节用一个十进制的整数来表示,并用点符号来分割各字节,
套接字,
主机A程序将传输信息写入至主机ASocket,然后通过与网卡相连的传输介质将信息传输至主机BSocket,主机B程序读取主机BSocket接收到的信息,将要回复的信息写入至主机BSocket,然后再次通过与网卡相连的传输介质将信息返回至主机ASocket,最后主机A程序读取主机ASocket,
两个程序之间的数据传输是通过套接字来完成的,可以将套接字理解为网络进程通信过程中所使用的一段缓冲区,
2.1
Learning hard 网络编程的更多相关文章
- 网络编程基础:网络基础之网络协议、socket模块
操作系统(简称OS)基础: 应用软件不能直接操作硬件,能直接操作硬件的只有操作系统:所以,应用软件可以通过操作系统来间接操作硬件 网络基础之网络协议: 网络通讯原理: 连接两台计算机之间的Intern ...
- TCP/UDP Linux网络编程详解
本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- python select网络编程详细介绍
刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- 猫哥网络编程系列:详解 BAT 面试题
从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...
- 浅谈C#网络编程(一)
阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...
- C++11网络编程
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...
- Java - 网络编程
Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh. 参考:
随机推荐
- 创建认证提供器 安全性与收尾工作 精通ASP-NET-MVC-5-弗瑞曼
- 科普文,搭建python开发环境
Python简介!首先,是一门面向对象的程序设计语言,先说3个优点!1.有条理,简单,易学,易用.2.强大!可以把其他编程语言制作的模块利用起来.3.拥有丰富的库.Python作为高级编程语言,拥有的 ...
- Git详解之常用命令
注意:此篇文章中的绝大部分内容来自摘抄,查阅人员请注意
- qt creator源码全方面分析(2)
目录 doc文件夹 帮助文档 qdoc工具 doxygen工具 qtcreator.qdocconf qtcreator-dev.qdocconf doc文件夹 对于bin和dist文件夹这里就不做过 ...
- divide and conquer - 最大连续子序列 - py
以HDU1231为例,代码之没法交如下: inf = 0x3f3f3f3f a = [0 for i in range(10005)] ans, L, R = -inf, 0, 0 def divid ...
- 第四次作业:使用Packet Tracer理解RIP路由协议及ICMP协议
0 个人信息 张樱姿 201821121038 计算1812 1 实验目的 理解RIP路由表的建立与更新 感受RIP坏消息传得慢 2 实验内容 使用Packet Tracer,正确配置网络参数,使用命 ...
- 深入理解windows 消息机制
深入理解Windows消息机制 今天我们来学一学Windows消息机制,我们知道在传统的C语音程序中,当我们需要打开一个文件时,我们可以调用fopen()函数,这个函数最后又会调用操作系统提供的函数以 ...
- Java入门基础(类)
类 在Java中表示自定义的数据类型,一个class可以是若干基本类型的组合. public class Student { public String id;//学号 public String n ...
- why NW NMM backup sqlserver failed and how to solve it
A NW NMM backup sqlserver failed. wow , I realze that maybe I put too many database backup together ...
- Go语言实现:【剑指offer】整数中1出现的次数(从1到n整数中1出现的次数)
该题目来源于牛客网<剑指offer>专题. 求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1.10.1 ...