计网与网络编程

目录

网络编程

ip号与端口号

三次握手和四次挥手的区别

阻塞模式与非阻塞模式的区别

epoll读写事件的触发条件

libevent

计网

互联网与以太网的区别

互联网

以太网

二者区别

为什么需要运输层


网络编程

ip号与端口号

IP 地址:可以在网络环境中,唯一标识一台主机。
端口号:可以网络的一台主机上,唯一标识一个进程。
ip 地址+端口号:可以在网络环境中,唯一标识一个进程。

三次握手和四次挥手的区别

第三次握手是可以携带数据的,前两次握手是不可以携带数据的

为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的 LISTEN 状态下的 SOCKET 当收到 SYN 报文的建连请求后,它可以把 ACK 和 SYN(ACK 起应答作用,而 SYN 起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的 FIN 报文通知时,它仅仅表示对方没有数据发送给你了,但是你还可以给对方发送数据,也有这么种可能,你还有一些数据在传给对方的途中,所以你不能立马关闭连接,也即你可能还需要把在传输途中的数据给对方之后,又或者,你还有一些数据需要传输给对方后,(再关闭连接)再发送FIN 报文给对方来表示你同意现在可以关闭连接了,即在发送ACK确认和FIN同步之间还可能会存在一些数据要发送给主动关闭端,所以它这里的 ACK 报文和 FIN 报文多数情况下都是分开发送的。

阻塞模式与非阻塞模式的区别

简单点说:阻塞就是干不完不准回来, 非阻塞就是你先干,我现看看有其他事没有,完了告诉我一声。需要声明:阻塞与非阻塞与函数无关,它是文件本身的属性

拿最常用的send和recv两个函数来说,比如调用send函数发送一定的Byte,在系统内部send做的工作其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执行成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有足够的可用缓冲区来保存Copy过来的数据的话

这时候就体现出阻塞和非阻塞的不同之处了:对于阻塞模式的socket,send函数将不返回直到系统缓冲区有足够的空间把你要发送的数据Copy过去以后才返回,而对于非阻塞的socket来说send会立即返回WSAEWOULDDBLOCK,告诉调用者说:发送操作被阻塞了。

对于recv函数,同样道理,该函数的内部工作机制其实是在等待TCP/IP协议栈的接收缓冲区通知它数据的的到达,对于阻塞模式的socket来说,如果TCP/IP协议栈的接收缓冲区没有通知一个结果给它,它就一直不返回,耗费着系统资源。对于非阻塞模式的socket,该函数会马上返回,然后告诉调用者:WSAEWOULDDBLOCK---"现在没有数据,回头在来看看"

扩展:在进行网络编程时,我们常常见到同步、异步、阻塞和非阻塞四种调用方式。

同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT值返回给调用者。

异步:异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以 CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个客户端通过调用 Connect函数发出一个连接请求后,调用者线程立刻可以向下运行。当连接真正建立起来以后,socket底 层会发送一个消息通知该对象。这里提到执行部件和调用者通过三种途径返回结果:状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执行部件提供 多种选择,否则不受调用者控制。如果执行部件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循 环去检查某个变量的值,这其实是一种很严重的错误)。如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知 没太多区别。

阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上它们是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。

非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

对象的阻塞模式和阻塞函数调用:对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的。阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。函数select就是这样的一个例子。

epoll读写事件的触发条件

可读状态与不可读状态

一个水杯里有水就是可读状态,水杯里没水就是不可读状态。读数据相当于喝水,喝(读)到水杯空了就不能喝(读)了。当朋友又给我到了一点水,这时候就从不可读变为可读了。(喝水等于读对方发来的数据)

可写状态与不可写状态

一个水杯未装满水就是可写状态,装满了水就是不可写状态。写数据相当于给客人倒水,客人水杯满了就不能再给他倒(写)了。当客人喝了一点,这时候就从不可写变了可写了。(倒水等于给对方发送数据)

LT模式(水平触发)
EPOLLIN触发条件:处于可读状态;从不可读状态变为可读状态。

EPOLLOUT触发条件:处于可写状态;从不可写状态变为可写状态。

说白了,LT模式就是能读的时候就可读,能写的时候就可写。

就绪事件包含EPOLLIN的条件:刚建立连接;有数据可读;断开连接
就绪事件包含EPOLLOUT的条件:内核写缓冲区未满,可写

ET模式(边缘触发)

EPOLLIN触发条件:从不可读状态变为可读状态;内核接收到新发来的数据。

EPOLLOUT触发条件:从不可写状态变为可写状态;

就绪事件包含EPOLLIN的条件:刚建立连接;内核接收到新数据;断开连接
就绪事件包含EPOLLOUT的条件:每次注册EPOLLOUT,下一次epoll_wait返回就绪事件包含EPOLLOUT(刚注册当然可写);内核写缓冲区从不可写变成可写;同时注册了EPOLLIN和EPOLLOUT,如果接收到新数据时可写则就绪事件既包含EPOLLIN也包含EPOLLOUT。

libevent

 

计网

这五层数据模型的建立是为了方便区分数据在封装时不同部分的作用。数据从应用层到物理层就是数据一层一层地加上首部进行传输的过程,当数据到达物理层时,已经封装完毕,接下来需要将数据上传到网络中去,等待目标主机接收并解析数据。

在这里插入图片描述

停止等待协议SW    回退N帧协议GBN   选择重传协议SR

回退N帧协议 发送方窗口长度不能大于2^{n}-1

PPP点对点协议

数据链路层基本问题: 封装成帧 透明传输 差错检测 

总线局域网 CSMA/CD协议:多点接入 载波监听 碰撞检测

无线局域网 CSMA/CA协议:多址接入 载波监听 碰撞避免

 共享信道划分:

  碰撞窗口 争用期

 

 

 

 当一台电脑更换网卡后,主机的IP地址没有改变,主机的MAC地址改变了。

IP地址是网络层的,MAC地址是数据链路层的。

互联网与以太网的区别

互联网

互联网(Internet)是一个网络的网络,它是由从地方到全球范围内几百万个私人的,政府的,学术界的,企业的和政府的网络所构成,通过电子,无线和光纤网络技术等等一系列广泛的技术联系在一起。

以太网

以太网(Ethernet)是为了实现局域网通信而设计的一种数据链路层技术,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网是目前应用最普遍的局域网技术,取代了其他局域网标准如令牌环、FDDI和ARCNET。

二者区别

1、简单地说,以太网是一直为了实现局域网通信而设计的一系列技术方案,包括物理层传输媒介和 CSMA/CD 协议等内容,而互联网是计算机网络。

2、以太网很普及,电脑上的以太网接口,Wi-Fi 接口,以太网交换机、路由器上的千兆,万兆以太网口,还有网线,它们都是以太网的组成部分,以太网可以用在局域网、广域网、也可以用在互联网上,现在网络有以太网化的趋势,因为简单易用,造成很普及,然后就得到很好的研究,10兆带宽,100 兆,1000 兆,万兆…这就是它的速率升级图。

而互联网则是由大大小小的运营商、公司、机构、用户连接起来网络的总称,里面包含以太网、ATM网、还有其它接口,如 E1/E3等等。

trunk是端口汇聚的意思,允许交换机与交换机,交换机与路由器,主机与交换机或者理由器之间通过两个或多个端口并行连接同时传输以提供更高的带宽,更大的吞吐量,大幅度提供整个网络能力。
端口设置trunk模式,是为了让端口能允许通过多个VLAN,,具体是几个、哪几个、还是全部,都是在端口trunk下设置

为什么需要运输层

从 IP 层来说,通信的两端是两台主机。IP 数据报的首部明确地标志了这两台主机的 IP地址。但“两台主机之间的通信”这种说法还不够清楚。这是因为,真正进行通信的实体是在主机中的进程,是这台主机中的一个进程和另一台主机中的一个进程在交换数据(即通信)。因此严格地讲,两台主机进行通信就是两台主机中的应用进程互相通信。IP 协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付主机中的应用进了程。从运输层的角度看,通信的真正端点并不是主机而是主机中的进程。也就是说,端到端的通信是应用进程之间的通信。

运输层有一个很重要的功能——复用(multiplexing)和分用(demutiplexing)。这里的复用是指在发送方不同的应用进程都可以使用同一个运输层协议传送数据(当然需要加上话当时首部),而“分用”是指接收方的运输层在剥去报文的首部后能够把这些数据正确交付目的应用进程”。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值