题主是否想询问“海康威视错误代码427原因”?通信问题。根据查询海康威视信息显示,网络故障、设备IP地址配置错误、和设备与服务器之间的通信问题,导致设备无法与服务器建立稳定的网络连接,从而引发错误代码427。
网络不可达。1、检查网线及交换机等组网设备,确保网络畅通。2、进入海康威视录像机主菜单,系统维护,网络检测,网络检测。3、在目的地址栏输入摄像机IP地址进行测试,目的地址不可达即表示网络链路不通。以上是海康威视错误码
1、海康威视摄像头驱动版本过低就会出现错误码(0X8005838),需要及时更新摄像头的驱动。2、首先打开海康威视官网。3、在主界面右上角搜索相应的海康威视摄像头版本型号。4、这时候就会出现相应的驱动文件,点击下载。5、下载
错误码0x022005c2是海康威视设备网络连接失败的错误码,通常表示设备无法连接到网络或者与网络连接不畅。具体原因可能包括以下几种情况:设备与网络断开连接。这可能是由于网络故障、设备出现故障或设备设置错误等原因导致的。设备
iVMS-4200.exe[302]的错误码:【问题原因】监控点不可用或者不存在。可能是设备网络中断导致设备掉线。解决的步骤如下:1、确认下该监控点的网络状态是否正常,一般是由于设备掉线导致的图像预览不了。2、若都是正常的,按照
海康威视错误代码大全
如果发送窗口大于接收窗口,接收方的缓冲区最终会溢出,接收方会死在那里
你的想法不能说错,但是在这个方向上无法得到最优解。现实情况是为了防止窗口发生重叠,发送窗口维持最大容量的一半就已经非常充分了。序号总共n位,那么整个发送空间撑死只有2^n帧,所以发送窗口有2^(n-1)就足以应付最
大于1。根据查询腾讯云计算得知,选择重传协议接收窗口大小大于1时,可保证帧的有序接收。数据链路层的滑动窗口协议中,窗口的大小在传输过程中是固定的。
错误重传数据帧或数据帧计时器到期。但是,那么我们就必须增加了接收窗口,先接受发送序列号不连续的,但仍然在接收窗框。等待,直到接收的数据帧丢失的数目,然后被发送到主机。这是一种选择性的重传ARQ协议。使用选择性重传AR
所以如果发送窗口>接收窗口,会导致数据链路资源的浪费(重传机会大大增加)。2、如果发送窗口<接收窗口。如发送窗口长度为2,正在发送1和2号帧,接收窗口长度为4,准备接收1-4号帧。这时,发送窗口要确认接收窗口接收了帧才
数据链路层中选择重传为何接收窗口小于等于发送窗口
GTP系统以成熟的消息中间件TongLINK/Q作为底层的传输核心,并以此为基础进行架构,从而保证了其核心系统稳定可靠、具有良好的可扩展性和相当好的处理性能、并且易于管理和维护。因为TongLINK/Q 可以独立应用于一般分布式系统中的可
消息中间件是用于两个应用程序之间传输消息(数据包)用,有各种分类,TongLINK/Q和MQ是商业软件中最常用的两种消息中间件,因为这两种消息中间件保证消息的可靠性,如,用socket传输数据,收到后除自己解析组装外,如果应用程
TongLink/Q每个节点都有一个节点名称,节点名称由英文字母、下划线、数字组成,但必须以英文字母打头,长度不得超过20个字符。每个节点对应一个IP地址,节点名配置在hosts文件中。节点间的连接通过TongLinkQ间虚拟的数据通道。To
用户必须定义足够大的内存空间来存储接收和发送的消息 ,空间不够会导致发送和接收消息失败,数据报消息本身没有长度限制,实际受TongLinkQ的可用BUFF数限制。文件消息(FILE_MSG):用户通过文件进行消息发送和接收,文件固定的保
TONGLINK/Q的消息管理
如果需要我可以发全部代码。所以有没有做过这方面内容的高手帮忙解决一下?不胜感激。发出读数据请求://测试读取当前Characteristic数据,会触发mOnDataAvailable.onCharacteristicRead()mHandler.postDelayed(new Runnable() { Ov
一定要调用这个方法,否则无法监听设备返回的数据,之前一直以为在uni.writeBLECharacteristicValue的回调里能得到返回的值,这个方法没有用,结果试了几天都不行, notifyBLECharacteristicValueChange(characteristicId) { console.log(characteristic
public static final int PROPERTY_WRITE = 0x08;在BLE的连接过程中,连接成功后会返回一个BluetoothGatt类型变量(见上一篇文章的2.7步骤),该类封装了BLE主要的操作。发送数据所需的Characteristic在BLE设备连接成功后的获取
若写入指令成功则回调BluetoothGattCallback中的onCharacteristicWrite()方法,说明将数据已经发送给下位机;若发送的数据符合通信协议,则服务端会向客户端回复相应的数据。发送的数据通过回调onCharacteristicChanged()方法获取,其
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { //System.out.println("---write success--- status:" + status); } /* * when connected successfully will c
会在某些特定的case下导致未知的bug或者空指针错误 所以,在中心设备跟外围开始连接后,你可以设定一个超时时间,在超时时间过后,依然没能回调onDescriptorWrite并获得BluetoothGatt.GATT_SUCCESS,则此次过程失败,你可以根据实际
异步问题 读写Characteristic、Descriptor等几乎所有BLE操作结果都为异步返回,若不等待上一次操作结果返回就执行下一次操作,很可能导致操作失败或者操作无效。onDescriptorWrite()返回的线程与写入线程为同一个线程,别的操作一般在
Android BLE 回调onCharacteristicWrite 时 返回的status 偶尔是失败 是什么原因呢?
错误代码。0xc015004是Windows系统中的一种常见错误代码,它与应用程序或软件的启动问题有关,海康威视4200软件无法正常启动可以尝试卸载并重新安装海康威视4200软件,确保操作系统已经安装了所有必要的运行时库和组件。
题主是否想询问“海康威视错误代码427原因”?通信问题。根据查询海康威视信息显示,网络故障、设备IP地址配置错误、和设备与服务器之间的通信问题,导致设备无法与服务器建立稳定的网络连接,从而引发错误代码427。
网络不可达。1、检查网线及交换机等组网设备,确保网络畅通。2、进入海康威视录像机主菜单,系统维护,网络检测,网络检测。3、在目的地址栏输入摄像机IP地址进行测试,目的地址不可达即表示网络链路不通。以上是海康威视错误码
1、海康威视摄像头驱动版本过低就会出现错误码(0X8005838),需要及时更新摄像头的驱动。2、首先打开海康威视官网。3、在主界面右上角搜索相应的海康威视摄像头版本型号。4、这时候就会出现相应的驱动文件,点击下载。5、下载
错误码0x022005c2是海康威视设备网络连接失败的错误码,通常表示设备无法连接到网络或者与网络连接不畅。具体原因可能包括以下几种情况:设备与网络断开连接。这可能是由于网络故障、设备出现故障或设备设置错误等原因导致的。设备
iVMS-4200.exe[302]的错误码:【问题原因】监控点不可用或者不存在。可能是设备网络中断导致设备掉线。解决的步骤如下:1、确认下该监控点的网络状态是否正常,一般是由于设备掉线导致的图像预览不了。2、若都是正常的,按照
海康威视错误代码大全
通过counter来评估报文是否丢失、延迟等。 Data ID 一般为2个byte,是ECU1和ECU2之间提前定好的特殊字段,AutoSAR profile1中对E2E_P01DataIDMode定义几种模式:BOTH、ALT、LOW、NIBBLE,Data ID用于报文checksum,但是特别注意的是这一段DI
网络管理策略深入到AutoSAR架构的各个层面,比如通过状态机来控制节点的唤醒和通信模式。主动唤醒节点持续发送管理报文,而被动节点则在接收到特定数量的报文后响应。报文内容包含了节点ID、控制信息,如重复请求或主动唤醒指示。通
在经典的AUTOSAR架构中,ComM系统服务是通信状态管理的关键组件。当ECU从休眠状态唤醒,用户通过主动请求COMM_FULL_COMMUNICATION或被动唤醒通知ComM_EcuM_WakeUpIndication,表明通信需求。在休眠期间,通过设置COMM_NO_COMMUNICATION
ECU异常退出时,环路中的节点会根据接收到的Ring报文数量调整,"TMax"定时器用于检测节点退出情况。Osek的复杂性体现在其LimpHome状态,它在特定错误条件下执行,如发送或接收失败。而Autosar的唤醒机制更为直接,主动节点发送
通过调用CanNM_NetworkRequest函数并设置CanNmActiveWakeupBitEnabled为TRUE,AWB会被置位为1,表示主动唤醒。反之,当节点被动接收报文并调用CanNM_PassiveStartUp时,AWB将被置位为0,表示被动唤醒状态。PNI的运用:当网络管理
1、发现并解决接收数据超时,握手验证第一步发送接收报文失败的问题,要检查网络连接是否正常。2、可以考虑修改发送超时时限的设置,最后可以重新安装操作系统,以恢复网络连接。3、也可以尝试重启路由器或者升级网络硬件进行解决。
怎么发现autosar网络管理报文发送失败
1、首先,检查ECU的状态,确认ECU是否正常工作,如果ECU有任何故障,可能会导致网络管理报文发送失败。 2、检查网络连接,确认网络是否正常,如果网络出现故障,可能会导致网络管理报文发送失败。 3、检查网络管理报文的发送频率,确认是否与Autosar规定的频率一致,如果发送频率不正确,可能会导致网络管理报文发送失败。 4、检查网络管理报文的内容,确认是否符合Autosar规定的内容,如果内容不正确,可能会导致网络管理报文发送失败。 5、检查网络管理报文的发送时间,确认是否与Autosar规定的发送时间一致,如果发送时间不正确,可能会导致网络管理报文发送失败。iVMS-4200.exe[302]的错误码: 【问题原因】 监控点不可用或者不存在。可能是设备网络中断导致设备掉线。 解决的步骤如下: 1、确认下该监控点的网络状态是否正常,一般是由于设备掉线导致的图像预览不了。 2、若都是正常的,按照下面的步骤设置即可。 3、设置完毕后,就可以看到远程的视频了。 注意:海康威视的通道分模拟和网络两种,模拟的通道号从1到32,网络的通道号从33到64,换算一下,如果网络摄像头接到1号网口上,则通道号为33。 资料拓展:录像机常见故障 问题1:当使用网络端时,不能监看,如何处理? 首先要明白使用网络端监看需要满足几个条件,网络端设置是否设置好了,网络是否畅通?如通过路由器上网软件需要的21个端口是否映射到主控端上?是否有个固定的IP或者域名?如果是局域网监看,那么只要保证设置好了,保证网络畅通(如果网络不畅通呢,检查一下线路)和主控端开着就可以监看。如果是广域网监看,除了网络端需要设置好,在看看主机能否上网?如果上不了。看看网关和DNS设置是否正确(其中网关和DNS应该是路由器的IP)?然后看看路由器是否能把端口映射到监控主机上?其中固定的IP或者域名是必不可少的。只要几个条件都符合了,监看是没有问题的。 问题2:机器反复自动重起 此现象是因为用户进行了一些非正常操作,累积效应致使Windows系统死机,而监控主机有死机保护功能,即重新启动Windows系统;另外机器放置环境通风条件不好使机箱或CPU风扇损坏而导致散热不充分,引起监控主机死机。解决建议:卸载软件,然后重新安装监控软件;改善通风条件,更换损坏风扇。 问题3:软件启动立即报告错误 此错误出现的概率极低,在一台管理正常的主机上不会出现。一般地,产生此故障的原因如下:1)用户主机经常性地突然断电; 2)多次在一台硬件配置极不稳定的机器上运行本软件。解决建议:检查主机配置,重新启动软件。 资料来源:百度词条录像机
海康威视网络摄像头为提升密码安全强度,保护用户设备安全正常的使用,首次使用的新设备(IPC)必须先激活,就是为了初次使用设备之前要设置一个登录密码,才能正常登陆和使用,解决方法: 1、录像机激活网络摄像头,首先在录像机开机后弹出:“激活界面”,创建设备登录密码(8-16位,英文数字混合的密码),如下图: 2、录像机激活后在主界面单击鼠标右键,在弹出的下拉菜单点击左键“主菜单”,再单击“通道管理”,弹出下图界面,对显示“未激活”的摄像头点击一键激活。 3、单击IP设备“未激活”按钮(一键激活:批量激活多个设备),弹出激活界面,如下图所示。(勾选“使用设备管理员密码”,则修改为NVR录像机的admin的登录密码一致)。
我的解决方案是当出现129的时候我通过代码将蓝牙重启来避免这个问题,代码如下: 在BluetoothLeService中用于一个静态变量disconStatus来记录返回连接断开状态吗,然后在mGattUpdateReceiver中对else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action))进行处理,希望能帮到你 if(mBluetoothLeService.disconStatus==129){ mBluetoothLeService.close(); Log.d(TAG,"----129----"); mBluetoothAdapter.disable(); try { Thread.sleep(2500); } catch (InterruptedException e) { e.printStackTrace(); } mBluetoothAdapter.enable(); }
2.1首先获取BluetoothManager 复制代码 代码如下: BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 2.2获取BluetoothAdapter 复制代码 代码如下: BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter(); 2.3创建BluetoothAdapter.LeScanCallback private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, int rssi, final byte[] scanRecord) { runOnUiThread(new Runnable() { @Override public void run() { try { String struuid = NumberUtils.bytes2HexString(NumberUtils.reverseBytes(scanRecord)).replace("-", "").toLowerCase(); if (device!=null && struuid.contains(DEVICE_UUID_PREFIX.toLowerCase())) { mBluetoothDevices.add(device); } } catch (Exception e) { e.printStackTrace(); } } }); } }; 2.4.开始搜索设备。 复制代码 代码如下: mBluetoothAdapter.startLeScan(mLeScanCallback); 2.5.BluetoothDevice 描述了一个蓝牙设备 提供了getAddress()设备Mac地址,getName()设备的名称。 2.6开始连接设备 /** * Connects to the GATT server hosted on the Bluetooth LE device. * * @param address * The device address of the destination device. * * @return Return true if the connection is initiated successfully. The * connection result is reported asynchronously through the * {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)} * callback. */ public boolean connect(final String address) { if (mBluetoothAdapter == null || address == null) { Log.w(TAG, "BluetoothAdapter not initialized or unspecified address."); return false; } // Previously connected device. Try to reconnect. (先前连接的设备。 尝试重新连接) if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress) && mBluetoothGatt != null) { Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection."); if (mBluetoothGatt.connect()) { mConnectionState = STATE_CONNECTING; return true; } else { return false; } } final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); if (device == null) { Log.w(TAG, "Device not found. Unable to connect."); return false; } // We want to directly connect to the device, so we are setting the // autoConnect // parameter to false. mBluetoothGatt = device.connectGatt(this, false, mGattCallback); Log.d(TAG, "Trying to create a new connection."); mBluetoothDeviceAddress = address; mConnectionState = STATE_CONNECTING; return true; } 2.7连接到设备之后获取设备的服务(Service)和服务对应的Characteristic。 // Demonstrates how to iterate through the supported GATT // Services/Characteristics. // In this sample, we populate the data structure that is bound to the // ExpandableListView // on the UI. private void displayGattServices(List gattServices) { if (gattServices == null) return; String uuid = null; ArrayList> gattServiceData = new ArrayList(); ArrayList>> gattCharacteristicData = new ArrayList(); mGattCharacteristics = new ArrayList(); // Loops through available GATT Services. for (BluetoothGattService gattService : gattServices) { HashMap currentServiceData = new HashMap(); uuid = gattService.getUuid().toString(); if (uuid.contains("ba11f08c-5f14-0b0d-1080")) {//服务的uuid //System.out.println("this gattService UUID is:" + gattService.getUuid().toString()); currentServiceData.put(LIST_NAME, "Service_OX100"); currentServiceData.put(LIST_UUID, uuid); gattServiceData.add(currentServiceData); ArrayList> gattCharacteristicGroupData = new ArrayList(); List gattCharacteristics = gattService.getCharacteristics(); ArrayList charas = new ArrayList(); // Loops through available Characteristics. for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) { charas.add(gattCharacteristic); HashMap currentCharaData = new HashMap(); uuid = gattCharacteristic.getUuid().toString(); if (uuid.toLowerCase().contains("cd01")) { currentCharaData.put(LIST_NAME, "cd01"); } else if (uuid.toLowerCase().contains("cd02")) { currentCharaData.put(LIST_NAME, "cd02"); } else if (uuid.toLowerCase().contains("cd03")) { currentCharaData.put(LIST_NAME, "cd03"); } else if (uuid.toLowerCase().contains("cd04")) { currentCharaData.put(LIST_NAME, "cd04"); } else { currentCharaData.put(LIST_NAME, "write"); } currentCharaData.put(LIST_UUID, uuid); gattCharacteristicGroupData.add(currentCharaData); } mGattCharacteristics.add(charas); gattCharacteristicData.add(gattCharacteristicGroupData); mCharacteristicCD01 = gattService.getCharacteristic(UUID.fromString("0000cd01-0000-1000-8000-00805f9b34fb")); mCharacteristicCD02 = gattService.getCharacteristic(UUID.fromString("0000cd02-0000-1000-8000-00805f9b34fb")); mCharacteristicCD03 = gattService.getCharacteristic(UUID.fromString("0000cd03-0000-1000-8000-00805f9b34fb")); mCharacteristicCD04 = gattService.getCharacteristic(UUID.fromString("0000cd04-0000-1000-8000-00805f9b34fb")); mCharacteristicWrite = gattService.getCharacteristic(UUID.fromString("0000cd20-0000-1000-8000-00805f9b34fb")); //System.out.println("=======================Set Notification=========================="); // 开始顺序监听,第一个:CD01 mBluetoothLeService.setCharacteristicNotification(mCharacteristicCD01, true); mBluetoothLeService.setCharacteristicNotification(mCharacteristicCD02, true); mBluetoothLeService.setCharacteristicNotification(mCharacteristicCD03, true); mBluetoothLeService.setCharacteristicNotification(mCharacteristicCD04, true); } } } 2.8获取到特征之后,找到服务中可以向下位机写指令的特征,向该特征写入指令。 public void wirteCharacteristic(BluetoothGattCharacteristic characteristic) { if (mBluetoothAdapter == null || mBluetoothGatt == null) { Log.w(TAG, "BluetoothAdapter not initialized"); return; } mBluetoothGatt.writeCharacteristic(characteristic); } 2.9写入成功之后,开始读取设备返回来的数据。 private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { String intentAction; //System.out.println("=======status:" + status); if (newState == BluetoothProfile.STATE_CONNECTED) { intentAction = ACTION_GATT_CONNECTED; mConnectionState = STATE_CONNECTED; broadcastUpdate(intentAction); Log.i(TAG, "Connected to GATT server."); // Attempts to discover services after successful connection. Log.i(TAG, "Attempting to start service discovery:" + mBluetoothGatt.discoverServices()); } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { intentAction = ACTION_GATT_DISCONNECTED; mConnectionState = STATE_DISCONNECTED; Log.i(TAG, "Disconnected from GATT server."); broadcastUpdate(intentAction); } } @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED); } else { Log.w(TAG, "onServicesDiscovered received: " + status); } } //从特征中读取数据 @Override public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { //System.out.println("onCharacteristicRead"); if (status == BluetoothGatt.GATT_SUCCESS) { broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); } } //向特征中写入数据 @Override public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { //System.out.println("--------write success----- status:" + status); } /* * when connected successfully will callback this method this method can * dealwith send password or data analyze *当连接成功将回调该方法 */ @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); if (characteristic.getValue() != null) { //System.out.println(characteristic.getStringValue(0)); } //System.out.println("--------onCharacteristicChanged-----"); } @Override public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { //System.out.println("onDescriptorWriteonDescriptorWrite = " + status + ", descriptor =" + descriptor.getUuid().toString()); UUID uuid = descriptor.getCharacteristic().getUuid(); if (uuid.equals(UUID.fromString("0000cd01-0000-1000-8000-00805f9b34fb"))) { broadcastUpdate(ACTION_CD01NOTIDIED); } else if (uuid.equals(UUID.fromString("0000cd02-0000-1000-8000-00805f9b34fb"))) { broadcastUpdate(ACTION_CD02NOTIDIED); } else if (uuid.equals(UUID.fromString("0000cd03-0000-1000-8000-00805f9b34fb"))) { broadcastUpdate(ACTION_CD03NOTIDIED); } else if (uuid.equals(UUID.fromString("0000cd04-0000-1000-8000-00805f9b34fb"))) { broadcastUpdate(ACTION_CD04NOTIDIED); } } @Override public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) { //System.out.println("rssi = " + rssi); } }; ---------------------------------------------- //从特征中读取数据 @Override public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { //System.out.println("onCharacteristicRead"); if (status == BluetoothGatt.GATT_SUCCESS) { broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); } }
你是管理员或者群主的话,系统会在群成员退群的时候及时通知你的。至于此信息已经保存在本地了,就是你QQ里,点击面板中的小喇叭,选择系统通知,就可以看见了。
消息中间件是用于两个应用程序之间传输消息(数据包)用,有各种分类,TongLINK/Q和MQ是商业软件中最常用的两种消息中间件,因为这两种消息中间件保证消息的可靠性,如,用socket传输数据,收到后除自己解析组装外,如果应用程序崩溃,则数据丢失,如果数据银行账务,则造成很严重的后果。如果用消息中间件传输,则保证消息可靠到达,并且,采用事务机制,即使程序崩溃,数据消息不不会丢,除非事务提交。平时,我们启停机器时,要杀死正运行的进程,如果用socket,这时,杀死进程就会丢数据,如果用消息中间件,就不存在此问题,应用进程以及消息中间件核心进程,都可随便杀死,也不会影响消息的可靠到达。这是消息中间件的核心功能。市场上除这两款消息中间件外,其它的消息中件也有类似的功能,但事务一致性及可靠性上,需要自己测试检查。
数据链路层的功能 数据链路层要完成许多特定的功能。这些功能包括为网络层提供设计良好的服务接口,处理帧同步,处理传输差错,调整帧的流速,不至于使慢速接收方被快速发送方淹没。 数据链路层的功能是为网络层提供服务。其基本服务是将源机器中来自网络层的数据传输给目的机器的网络层。 数据链路层一般都提供3种基本服务,即无确认的无连接服务、有确认的无连接服务、有确认 的面向连接的服务。(1)无确认的无连接服务 无确认的无连接服务是源机器向目的机器发送独立的帧,而目的机器对收到的帧不作确认。如果由于线路上的噪声而造成帧丢失,数据链路层不作努力去恢复它,恢复工作留给上层去完成。这类服务适用于误码率很低的情况,也适用于像语音之类的实时传输,实时传输情况下有时数据延误比数据损坏影响更严重。大多数局域网在数据链路层都使用无确认的无连接服务。 (2)有确认的无连接服务 这种服务仍然不建立连接,但是所发送的每一帧都进行单独确认。以这种方式,发送方就会知道帧是否正确地到达。如果在某个确定的时间间隔内,帧没有到达,就必须重新发此帧。 (3)有确认的面向连接的服务 采用这种服务,源机器和目的机器在传递任何数据之前,先建立一条连接。在这条连接上所发送的每一帧都被编上号,数据链路层保证所发送的每一帧都确实已收到。而且,它保证每帧只收到一次,所有的帧都是按正确顺序收到的。面向连接的服务为网络进程间提供了可靠地传送比特流的服务。 2.帧同步 在数据链路层,数据的传送单位是帧。所谓帧,是指从物理层送来的比特流信息按照一定的格式进行分割后形成的若干个信息块。数据一帧一帧地传送,就可以在出现差错时,将有差错的帧再重传一次,从而避免了将全部数据都重传。 帧同步是指接收方应当能从收到的比特流中准确地区分出一帧的开始和结束在什么地方。 3.差错控制 传送帧时可能出现的差错有:位出错,帧丢失,帧重复,帧顺序错。 位出错的分布规律及出错位的数量很难限制在预定的简单模式中,一般采用漏检率及其微小的CRC检错码再加上反馈重传的方法来解决。为了保证可靠传送,常采用的方法是向数据发送方提供有关接收方接收情况的反馈信息。一个否定性确认意味着发生了某种差错,相应的帧必须被重传。这种做法即是反馈重传。 更复杂的情况是,一个帧可能完全丢失(比如,消失在突发性噪声中)。在这种情况下,发送方将会永远等下去。 这个问题可以通过在数据链路层中引入计时器来解决,当发送方发出一帧时,通常也启动计时器。该计时器计到设置值的时间时清为零。 如果所传出的帧或者确认信息被丢失了,则计时器会发出超时信号,提醒发送方可能出现了问题,最明显的解决方法是重传此帧。 但是多次传送同一帧的危险是接收方可能两次甚至多次收到同一帧,为了防止这种情况发生,通常有必要对发出的各帧编号,这样接收方就能辨别出是重复帧还是新帧,还能分辨出帧顺序错。 采用定时器和编号的主要目的是保证每帧都能最终正确地传给目的地—网络层。 差错出现的特点:随机,连续突发(burst) 处理差错的两种基本策略 使用纠错码:发送方在每个数据块中加入足够的冗余信息,使得接收方能够判断接收到的数据是否有错,并能纠正错误。 使用检错码:发送方在每个数据块中加入足够的冗余信息,使得接收方能够判断接收到的数据是否有错,但不能判断哪里有错。4.流量控制 在数据链路层及较高层中另一个重要的设计问题是:如何处理发送方的传送能力比接收方接收能力大的问题? 通常的解决办法是引入流量控制来限制发送方所发出的数据流量,使其发送速率不要超过接收方能处理的速率。 流量控制方法有发送等待方法、预约缓冲区法、滑动窗口控制方法、许可证法和限制管道容量方法等。 下面简要介绍一下滑动窗口控制方法。 在所有的滑动窗口协议中,每一个要发出的帧都包含一个序列号,范围是0到某个最大值。 具有最简单流量控制的数据链路层协议 为了使收方的接收缓冲区在任何情况下都不会溢出,最简单的方法是发方从主机每取一个数据块,就将其送到数据链路层的发送缓冲区中发送出去,然后等待;收方收到数据帧后,将其放入数据链路层的接收缓冲区并交付给主机,同时回应一信息给发送节点表示数据帧已经上交给主机,接收任务已经完成;发方收到由接收站点发过来的双方事先商定好的信息,则从主机取下一个新的数据帧再发送。在这种情况下,收方的接收缓冲区的大小只要能够装得下一个数据帧即可,这就是最简单最基本的停止-等待(Stop-and-Wait)协议。
OSI - 介绍 OSI模型 OSI 国际标准组织(国际标准化组织)制定了OSI模型。这个模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。1至4层被认为是低层,这些层与数据移动密切相关。5至7层是高层,包含应用程序级的数据。每一层负责一项具体的工作,然后把数据传送到下一层。物理层物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础。物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。媒体和互连设备物理层的媒体包括架空明线、平衡电缆、光纤、无线信道等。通信用的互连设备指DTE和DCE间的互连设备。DTE既数据终端设备,又称物理设备,如计算机、终端等都包括在内。而DCE则是数据通信设备或电路连接设备,如调制解调器等。数据传输通常是经过DTE──DCE,再经过DCE──DTE的路径。互连设备指将DTE、DCE连接起来的装置,如各种插头、插座。LAN中的各种粗、细同轴电缆、T型接、插头,接收器,发送器,中继器等都属物理层的媒体和连接器。 物理层的一些重要标准 物理层的一些标准和协议早在OSI/TC97/C16 分技术委员会成立之前就已制定并在应用了,OSI也制定了一些标准并采用了一些已有的成果。ISO2110:称为“数据通信----25芯DTE/DCE接口连接器和插针分配”。它与EIA(美国电子工业协会)的“RS-232-C”基本兼容。ISO2593:称为“数据通信----34芯DTE/DCE----接口连接器和插针分配”。ISO4092:称为“数据通信----37芯DTE/DEC----接口连接器和插针分配”。与EIARS-449兼容。CCITT V.24:称为“数据终端设备(DTE)和数据电路终接设备之间的接口电路定义表”。其功能与EIARS-232-C及RS-449兼容于100序列线上。 数据链路层数据链路可以粗略地理解为数据通道。物理层要为终端设备间的数据通信提供传输媒体及其连接。媒体是长期的,连接是有生存期的。在连接生存期内,收发两端可以进行不等的一次或多次数据通信。每次通信都要经过建立通信联络和拆除通信联络两过程,这种建立起来的数据收发关。 系就叫作数据链路。而在物理媒体上传输的数据难免受到各种不可靠因素的影响而产生差错,为了弥补物理层上的不足,为上层提供无差错的数据传输,就要能对数据进行检错和纠错。数据链路的建立,拆除,对数据的检错,纠错是数据链路层的基本任务。 数据链路层的主要协议 数据链路层协议是为发对等实体间保持一致而制定的,也为了顺利完成对网络层的服务。主要协议如下:ISO1745--1975:“数据通信系统的基本型控制规程”。这是一种面向字符的标准,利用10个控制字符完成链路的建立,拆除及数据交换。对帧的收发情况及差错恢复也是靠这些字符来完成。ISO1155、ISO1177、ISO2626、 ISO2629等标准的配合使用可形成多种链路控制和数据传输方式。ISO3309--1984:称为“HDLC 帧结构”。ISO4335--1984:称为“HDLC 规程要素 ”。ISO7809--1984:称为“HDLC 规程类型汇编”。这3个标准都是为面向比特的数据传输控制而制定的。有人习惯上把这3个标准组合称为高级链路控制规程。ISO7776:称为“DTE数据链路层规程”。与CCITT X.25LAB“平衡型链路访问规程”相兼容。 链路层产品 独立的链路产品中最常见的当属网卡,网桥也是链路产品。MODEM的某些功能有人认为属于链路层,对些还有争议。数据链路层将本质上不可靠的传输媒体变成可靠的传输通路提供给网络层。在IEEE802.3情况下,数据链路层分成了两个子层,一个是逻辑链路控制,另一个是媒体访问控制。 网络层 网络层的产生也是网络发展的结果。在联机系统和线路交换的环境中,网络层的功能没有太大意义。当数据终端增多时。它们之间有中继设备相连。此时会出现一台终端要求不只是与唯一的一台而是能和多台终端通信的情况,这就是产生了把任意两台数据终端设备的数据链接起来的问题,也就是路由或者叫寻径。另外,当一条物理信道建立之后,被一对用户使用,往往有许多空闲时间被浪费掉。人们自然会希望让多对用户共用一条链路,为解决这一问题就出现了逻辑信道技术和虚拟电路技术。 网络层标准简介 网络层的一些主要标准如下: ISO.DIS8208:称为“DTE用的X.25分组级协议” ISO.DIS8348:称为“CO 网络服务定义”(面向连接) ISO.DIS8349:称为“CL 网络服务定义”(面向无连接) ISO.DIS8473:称为“CL 网络协议” ISO.DIS8348:称为“网络层寻址” 除上述标准外,还有许多标准。这些标准都只是解决网络层的部分功能,所以往往需要在网络层中同时使用几个标准才能完成整个网络层的功能。由于面对的网络不同,网络层将会采用不同的标准组合。 在具有开放特性的网络中的数据终端设备,都要配置网络层的功能。现在市场上销售的网络硬设备主要有网关和路由器。 传输层传输层 传输层是两台计算机经过网络进行数据通信时,第一个端到端的层次,具有缓冲作用。当网络层服务质量不能满足要求时,它将服务加以提高,以满足高层的要求;当网络层服务质量较好时,它只用很少的工作。传输层还可进行复用,即在一个网络连接上创建多个逻辑连接。传输层也称为运输层,传输层只存在于端开放系统中,是介于低3层通信子网系统和高3层之间的一层,但是很重要的一层。因为它是源端到目的端对数据传送进行控制从低到高的最后一层。 有一个既存事实,即世界上各种通信子网在性能上存在着很大差异。例如电话交换网、分组交换网、公用数据交换网,局域网等通信子网都可互连,但它们提供的吞吐量、传输速率,数据延迟通信费用各不相同。对于会话层来说,却要求有一性能恒定的界面。传输层就承担了这一功能.它采用分流/合流,复用/介复用技术来调节上述通信子网的差异,使会话层感受不到。 此外传输层还要具备差错恢复,流量控制等功能,以此对会话层屏蔽通信子网在这些方面的细节与差异。传输层面对的数据对象已不是网络地址和主机地址,而是和会话层的界面端口。上述功能的最终目的是为会话提供可靠的、无误的数据传输。传输层的服务一般要经历传输连接建立阶段,数据传送阶段,传输连接释放阶段3个阶段才算完成一个完整的服务过程。而在数据传送阶段又分为一般数据传送和加速数据传送两种。传输层服务分成5种类型。基本可以满足对传送质量、传送速度、传送费用的各种不同需要。传输层的协议标准有以下几种: ISO8072:称为“面向连接的传输服务定义” ISO8072:称为“面向连接的传输协议规范” 会话层 会话层提供的服务可使应用建立和维持会话,并能使会话获得同步。会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信。这种能力对于传送大的文件极为重要。会话层、表示层、应用层构成开放系统的高3层,面对应用进程提供分布处理,对话管理,信息表示,恢复最后的差错等。会话层同样要担负应用进程服务要求,而运输层不能完成的那部分工作,给运输层功能差距以弥补。主要的功能是对话管理,数据流同步和重新同步。要完成这些功能,需要由大量的服务单元功能组合,已经制定的功能单元已有几十种。现将会话层主要功能介绍如下。 为会话实体间建立连接。为给两个对等会话服务用户建立一个会话连接,应该做如下几项工作: 将会话地址映射为运输地址 选择需要的运输服务质量参数(QOS) 对会话参数进行协商 识别各个会话连接 传送有限的透明用户数据 数据传输阶段 这个阶段是在两个会话用户之间实现有组织的,同步的数据传输。用户数据单元为SSDU,而协议数据单元为SPDU。会话用户之间的数据传送过程是将SSDU转变成SPDU进行的。 表示层组件 连接释放是通过“有序释放”、“废弃”、“有限量透明用户数据传送”等功能单元来释放会话连接的、会话层标准为了使会话连接建立阶段能进行功能协商,也为了便于其它国际标准参考和引用。定义了12种功能单元、各个系统可根据自身情况和需要,以核心功能服务单元为基础。选配其他功能单元组成合理的会话服务子集、会话层的主要标准有“DIS8236:会话服务定义”和“DIS8237:会话协议规范”。 表示层 这一层主要解决拥护信息的语法表示问题。它将欲交换的数据从适合于某一用户的抽象语法,转换为适合于OSI系统内部使用的传送语法。即提供格式化的表示和转换数据服务。数据的压缩和解压缩, 加密和解密等工作都由表示层负责。 第7层是“一切”。第7层也称作“应用层”,是专门用于应用程序的。应用层确定进程之间通信的性质以满足用户需要以及提供网络与用户应用软件之间的接口服务如果你的程序需要一种具体格式的数据,你可以发明一些你希望能够把数据发送到目的地的格式,并且创建一个第7层协议。SMTP、DNS和FTP都是7层协议。 OSI - 各层功能 OSI物理层的主要功能 为数据端设备提供传送数据的通路,数据通路可以是一个物理媒体,也可以是多个物理媒体连接而成。一次完整的数据传输、包括激活物理连接、传送数据、终止物理连接。所谓激活,就是不管有多少物理媒体参与,都要在通信的两个数据终端设备间连接起来,形成一条通路。 传输数据。物理层要形成适合数据传输需要的实体,为数据传送服务。一是要保证数据能在其上正确通过,二是要提供足够的带宽(带宽是指每秒钟内能通过的比特(bit)数),以减少信道上的拥塞。传输数据的方式能满足点到点,一点到多点、串行或并行、半双工或全双工,同步或异步传输的需要。完成物理层的一些管理工作。链路层的主要功能 链路层是为网络层提供数据传送服务的,这种服务要依靠本层具备的功能来实现。链路层应具备如下功能: 链路连接的建立,拆除,分离。 帧定界和帧同步。数据链路层的数据传输单元是帧,协议不同,帧的长短和界面也有差别,但无论如何必须对帧进行定界。 顺序控制,指对帧的收发顺序的控制。 差错检测和恢复。还有链路标识,流量控制等等。差错检测多用方阵码校验和循环码校验来检测信道上数据的误码,而帧丢失等用序号检测。各种错误的恢复则常靠反馈重发技术来完成。网络层主要功能 网络层为建立网络连接和为上层提供服务,应具备以下主要功能:路由选择和中继;激活、终止网络连接;在一条数据链路上复用多条网络连接,多采取分时复用技术;差错检测与恢复;排序、流量控制;服务选择;网络管理;运输层主要功能此层表示处理数据交付问题的较低层和与应用层软件协同工作的较高层之间的过渡点。运输层负责应用进程之间的 端到端通信,而它部分地通过进程级寻址和复用或分解来实现的。运输层协议负责将应用层数据分段成要发送的块,可以是面向连接的或者是无连接的。此层的协议也常提供数据交付管理服务如可靠性和流量控制。(处理及寻址;多路复用/分解;连接;分段和重组;确认和重传;流量控制)OSI - 实际代表意思 IP协议假如你是一个网络上的操作系统。在1层和2层工作的网卡将通知你什么时候有数据到达。驱动程序处理2层帧的出口,通过它你可以得到一个发亮和闪光的3层数据包(希望是如此)。作为操作系统,你将调用一些常用的应用程序处理3层数据。如果这个数据是从下面发上来的,你知道那是发给你的数据包,或者那是一个广播数据包(除非你同时也是一个路由器,不过,暂时不用担心这个问题)。如果你决定保留这个数据包,你将打开它,并且取出4层数据包。如果它是TCP协议,这个TCP子系统将被调用并打开这个数据包,然后把这个7层数据发送给在目标端口等待的应用程序。这个过程就结束了。 当要对网络上的其它计算机做出回应的时候,每一件事情都以相反的顺序发生。7层应用程序将把数据发送给TCP协议的执行者。然后,TCP协议在这些数据中加入额外的文件头。在这个方向上,数据每前进一步体积都要大一些。TCP协议在IP协议中加入一个合法的TCP字段。然后,IP协议把这个数据包交给以太网。以太网再把这个数据作为一个以太网帧发送给驱动程序。然后,这个数据通过了这个网络。这条线路中的路由器将部分地分解这个数据包以获得3层文件头,以便确定这个数据包应该发送到哪里。如果这个数据包的目的地是本地以太网子网,这个操作系统将代替路由器为计算机进行地址解析,并且把数据直接发送给主机。