搜档网
当前位置:搜档网 › 网络编程OSI开放式系统互联参考模型七层参考模型

网络编程OSI开放式系统互联参考模型七层参考模型

网络编程OSI开放式系统互联参考模型七层参考模型
网络编程OSI开放式系统互联参考模型七层参考模型

网络编程,OSI(开放式系统互联参考模型)七层参考模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

套接字(Socket)是网络通信的基本构建模块,又分为流式套接字(Stream Socket)和数据报套接字(Datagram Socket)两种类型的套接字。

TCP:传送控制协议(Transmission Control Protocol),这是一种提供给用户的可靠的全双工字节流面向连接的协议。

UDP:用户数据报协议(User Datagram Protocol),这是提供给用户进程的无连接协议,用于传送数据而不执行正确性检查。

当然TCP、UDP都归属于传输层协议。

对所用的网络知识简短的介绍,下面步入正题,开始Qt套接字编程~

在TCP/IP网络中两个进程间的相互作用的主要模式是客户机/服务器模式(Client/Server model),是构造分布式应用程序最常用的模式。

Qt中几乎所有的QtNetwork类都是异步的,一般情况下没有必要Socket使用在多线程中。

■、UDP

UDP是不可信赖的,它是基于包的协议。一些应用程序层的协议使用UDP是因为它比TCP更加小巧,数据是从一个主机到另一个主机以包的形式发送的。这里没有连接到的概念,并且如果一个UDP包没有被正确交付,它不会向系统报告任何错误。

下面写一个简单的广播示例,由客户端和服务器两部分组成。

//客户端发送数据

void Client::sendDatagram()

{

QByteArray datagram;

QDataStream out(&datagram, QIODevice::WriteOnly);

out.setVersion(QDataStream::Qt_4_3);

out << QDateTime::currentDateTime() << "vic.MINg!" << 3.14;

QUdpSocket udpSocket(this);

udpSocket.writeDatagram(datagram, QHostAddress::Broadcast, 1981);

}

在QByteArray型局部变量datagram中构建待发送的数据包,然后通过QUdpSocket类的writeDatagram ( const QByteArray & datagram, const QHostAddress & host, quint16 port );函数将数据包发出。值得注意的是,这里的地址使用了QHostAddress::Broadcast值,它对应IPv4下的广播地址,如果将该值更换成单机地址(如本机地址QHostAddress::LocalHost),将变成一个普通的点对点的UDP程序。

//服务器接收数据

void Server::initSocket()

{

udpSocket = new QUdpSocket(this);

udpSocket->bind(1981);

connect(udpSocket, SIGNAL(readyRead()),

this, SLOT(readPendingDatagrams()));

}

初始化生成QUdpSocket实例,并绑定与客户端约定的端口(1981)。这里多说几句,在编写网络程序时应该使用1024以上的端口号,1024以下的端口号通常被系统保留,紧密的绑定了一些服务(如80端口是http服务、21端口是ftp服务)。

void Server::readPendingDatagrams()

{

while (udpSocket->hasPendingDatagrams()) {

QByteArray datagram;

datagram.resize(udpSocket->pendingDatagramSize());

QHostAddress sender;

quint16 senderPort;

udpSocket->readDatagram(datagram.data(), datagram.size(),

&sender, &senderPort);

QDateTime dateTime;

QString name;

double data;

QDataStream in(&datagram, QIODevice::ReadOnly);

in.setVersion(QDataStream::Qt_4_3);

in >> dateTime >> name >> data;

}

}

接受数据函数首先调用QUdpSocket类的成员函数hasPendingDatagrams()以判断是否有可供读取的数据。如果有则通过pendingDatagramSize()获取当前可供读取的UDP报文大小,并据此大小分配接收缓冲区,最后读取相应数据。

■、TCP

TCP是一个基于流的协议。对于应用程序,数据表现为一个长长的流,而不是一个大大的平面文件。基于TCP的高层协议通常是基于行的或者基于块的。

●、基于行的协议把数据作为一行文本进行传输,每行都以一个换行符结尾。

●、基于块的协议把数据作为二进制块进行传输,每块是由一个size大小字段和紧跟它的一个size 字节的数据组成。

QTcpSocket通过器父类QAbstractSocket继承了QIODevice,因此他可以通过使用QTextStream 和QDataStream来进行读取和写入。

QTcpServer类在服务器端处理来自TCP客户端连接数据,需要注意的是,该类直接继承于QObject基类,而不是QAbstractSocket抽象套接字类。

下面介绍一个TCP应用示例,示例来自《精通Qt4编程》,感觉十分不错,它也是由客户端和服务器两部分组成,客户端选择本地文件,并通过TCP连接将它上传到服务器端。

由于使用了TCP协议,所以可以轻松的传递大文件,而无需担心传输过程造成文件损坏。

其中客户端程序SendFile从本地文件系统中选中一个已有文件并在成功连接服务器后开始发送,服务器端程序ReceiveFile则将该文件保存在当前目录下,两端均以进度条和数据两种形式分别显示文件传输进度和详细的数据传输字节数。

客户端程序SendFile的用户界面是一个简单的对话框,上面布置一个QProgressBar进度条,一个用于显示状态的QLabel,三个QPushButton按钮,分别用来选择文件、发送文件和退出程序。

Qt的QFileDialog类提供了一个文件选择对话框,用户使用它可以很容易的进行目录或文件的选择。

下面将Dialog类部分代码陈列出来,它是QDialog的子类,实现客户端的全部功能。

class Dialog : public QDialog

{

Q_OBJECT

public:

Dialog(QWidget *parent = 0);

public slots:

void start();

void startTransfer();

void updateClientProgress(qint64 numBytes);

void displayError(QAbstractSocket::SocketError socketError);

void openFile();

private:

QProgressBar *clientProgressBar;

QLabel *clientStatusLabel;

QPushButton *startButton;

QPushButton *quitButton;

QPushButton *openButton;

QDialogButtonBox *buttonBox;

QTcpSocket tcpClient; //客户端套接字

qint64 TotalBytes; //总共需发送的字节数

qint64 bytesWritten; //已发送字节数

qint64 bytesToWrite; //待发送字节数

qint64 loadSize; //被初始化为一个4Kb的常量

QString fileName; //待发送的文件的文件名

QFile *localFile; //待发送的文件

QByteArray outBlock; //缓存一次发送的数据

};

为了发送较大的文件,变量使用了qint64类型,Qt保证该类型数据在所有其所支持的平台下均为64位大小,这几乎可以表示一个无限大的文件了。

loadSize用来尽可能的将一个较大的文件分割,每次发送4Kb大小,余下不足4Kb的按实际大小发送。

Dialog::Dialog(QWidget *parent)

: QDialog(parent)

{

loadSize = 4*1024; // 4Kb

TotalBytes = 0;

bytesWritten = 0;

bytesToWrite = 0;

clientProgressBar = new QProgressBar;

clientStatusLabel = new QLabel(tr("客户端就绪"));

startButton = new QPushButton(tr("开始"));

quitButton = new QPushButton(tr("退出"));

openButton = new QPushButton (tr("打开"));

startButton->setEnabled(false);

buttonBox = new QDialogButtonBox;

buttonBox->addButton(startButton, QDialogButtonBox::ActionRole);

buttonBox->addButton(openButton, QDialogButtonBox::ActionRole);

buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);

connect(startButton, SIGNAL(clicked()), this, SLOT(start()));

connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));

connect(openButton, SIGNAL(clicked()), this, SLOT(openFile()));

connect(&tcpClient, SIGNAL(connected()), this, SLOT(startTransfer()));

connect(&tcpClient, SIGNAL(bytesWritten(qint64)),

this, SLOT(updateClientProgress(qint64)));

connect(&tcpClient, SIGNAL(error(QAbstractSocket::SocketError)),

this, SLOT(displayError(QAbstractSocket::SocketError)));

QVBoxLayout *mainLayout = new QVBoxLayout;

mainLayout->addWidget(clientProgressBar);

mainLayout->addWidget(clientStatusLabel);

mainLayout->addStretch(1);

mainLayout->addSpacing(10);

mainLayout->addWidget(buttonBox);

setLayout(mainLayout);

setWindowTitle(tr("发送文件"));

}

这里关联了QTcpSocket的三个重要信号,它们分别是成功与服务器建立连接后产生的connected()信号,数据成功发送后产生的bytesWritten()信号和产生错误的error()信号。

void Dialog::openFile()

{

fileName = QFileDialog::getOpenFileName(this);

if (!fileName.isEmpty())

startButton->setEnabled(true);

}

用户在客户端界面按下"打开"按钮后,openFile()槽函数将被调用。该函数通过Qt文件选择对画框QFileDialog所提供的静态函数getOpenFileName(),能够很容易地返回用户所选取的文件名,这里将其保存在私有成员变量fileName中。如果选中返回的文件名非空,将激活"开始"按钮。

void Dialog::start()

{

startButton->setEnabled(false);

QApplication::setOverrideCursor(Qt::WaitCursor);

bytesWritten = 0;

clientStatusLabel->setText(tr("连接中..."));

tcpClient.connectToHost(QHostAddress::LocalHost, 16689);

}

用户在客户端界面按下"开始"按钮后,start()槽函数将被调用。该函数的主要功能是连接服务器,它使用了QTcpSocket类的connectToHost()函数,其中的两个参数分别是服务器主机地址及其监听端口,读者可以根据实际应用需求进行修改。

void Dialog::startTransfer()

{

localFile = new QFile(fileName);

if (!localFile->open(QFile::ReadOnly )) {

QMessageBox::warning(this, tr("应用程序"),

tr("无法读取文件%1:\n%2.")

.arg(fileName)

.arg(localFile->errorString()));

return;

}

TotalBytes = localFile->size();

QDataStream sendOut(&outBlock, QIODevice::WriteOnly);

sendOut.setVersion(QDataStream::Qt_4_3);

QString currentFile = fileName.right(fileName.size() - https://www.sodocs.net/doc/e916070812.html,stIndexOf('/') -

1);

sendOut << qint64(0) << qint64(0) << currentFile;

TotalBytes += outBlock.size();

sendOut.device()->seek(0);

sendOut << TotalBytes << qint64((outBlock.size() - sizeof(qint64) * 2));

bytesToWrite = TotalBytes - tcpClient.write(outBlock);

clientStatusLabel->setText(tr("已连接"));

qDebug() << currentFile << TotalBytes;

outBlock.resize(0);

}

一旦连接建立成功,QTcpSocket类将发出connected()消息,继而调用startTransfer()槽函数。该函数首先向服务器端发送一个文件头结构。

文件头结构由三个字段组成,分别是64位的总长度(包括文件数据长度和文件头自身长度),64位的文件名长度和文件名。

函数startTransfer()首先以只读方式打开选中的文件,然后通过QFile类的size()函数获取待发送文件的大小,并将该值暂存于TotalBytes变量中。

接下来将发送缓冲区outBlock封装在一个QDataStream类型的变量中,这样做可以很方便的通过重载的"<<"操作符填写文件头结构。

设置文件头结构的操作有些小技巧,这里首先通过QString类的right()函数去掉文件的路径部分,仅将文件部分保存在currentFile变量中,然后通过sendOut << qint64(0) << qint64(0) << currentFile 操作构造一个临时的文件头,将该值追加到TotalBytes字段,从而完成实际需发送字节数的记录。

接着通过sendOut.device()->seek(0)函数将读写操作指向从头开始,并且调用类似操作sendOut

<< TotalBytes << qint64((outBlock.size() - sizeof(qint64) * 2)),填写实际的总长度和文件长度。

需要注意的是,不能错误地通过QString::size()函数获取文件名的大小,该函数返回的是QString 类型文件名所包含的字节数,而不是实际所占存储空间的大小,由于字节编码和QString类存储管理的原因,两者往往并不相等。

完成了文件头结构的填写后,调用tcpClient.write(outBlock)函数将该文件头发出,同时修改待发送字节数bytesToWrite。最后,调用outBlock.resize(0)函数清空发送缓冲区以备下次使用。

void Dialog::updateClientProgress(qint64 numBytes)

{

bytesWritten += (int)numBytes;

if (bytesToWrite > 0) {

outBlock = localFile->read(qMin(bytesToWrite, loadSize));

bytesToWrite -= (int)tcpClient.write(outBlock);

outBlock.resize(0);

}

else{

localFile->close();

}

clientProgressBar->setMaximum(TotalBytes);

clientProgressBar->setValue(bytesWritten);

clientStatusLabel->setText(tr("已发送%1MB").arg(bytesWritten / (1024 * 1024)));

}

一旦数据发出,QTcpSocket类将会产生bytesWritten()信号,继而调用updateClientProgress(qint64)槽函数,参数表示实际已发出的字节数。如果待发送数据计数bytesToWritten大于0,将尽可能地从发送文件中读取4Kb数据,并将其发送,否则发送完毕关闭文件。还需要在此更新亦发和待发数据计数,并以此更新发送进度条和状态显示。

void Dialog::displayError(QAbstractSocket::SocketError socketError)

{

if (socketError == QTcpSocket::RemoteHostClosedError)

return;

QMessageBox::information(this, tr("网络"),

tr("产生如下错误: %1.").arg(tcpClient.errorString()));

tcpClient.close();

clientProgressBar->reset();

clientStatusLabel->setText(tr("客户端就绪"));

startButton->setEnabled(true);

QApplication::restoreOverrideCursor();

}

如果连接或数据传输过程中的某次操作发生错误,QTcpSocket类发出error()信号,并触发错误处理槽函数displayError()。该函数的错误处理方式比较简单,仅是显示出错误对话框并关闭连接。

main()函数实现与以前的例子类似,这里不再叙述了。

服务器端程序ReceiveFile完成的功能与客户端程序恰恰相反,它负责从TCP连接上接收数据,并将其写入当前目录下的指定文件中。

其界面也是一个简单的对话框,上面布置一个QProgressBar进度条,一个用来显示状态的QLabel,两个QPushButton按钮分别用来开启监听和退出程序。

该程序的主要功能也是在一个从QDialog类继承而来的Dialog类中完成的。

class Dialog : public QDialog

{

Q_OBJECT

public:

Dialog(QWidget *parent = 0);

public slots:

void start();

void acceptConnection();

void updateServerProgress();

void displayError(QAbstractSocket::SocketError socketError);

private:

QProgressBar *clientProgressBar;

QProgressBar *serverProgressBar;

QLabel *serverStatusLabel;

QPushButton *startButton;

QPushButton *quitButton;

QPushButton *openButton;

QDialogButtonBox *buttonBox;

QTcpServer tcpServer; //服务器套接字

QTcpSocket *tcpServerConnection; //连接后服务器返回的套接字

qint64 TotalBytes; //总共需接收的字节数

qint64 bytesReceived; //已接收字节数

qint64 fileNameSize; //待接收文件名字节数

QString fileName; //待接收文件的文件名

QFile *localFile; //待接收文件

QByteArray inBlock;

};

Dialog::Dialog(QWidget *parent)

: QDialog(parent)

{

TotalBytes = 0;

bytesReceived = 0;

fileNameSize = 0;

serverProgressBar = new QProgressBar;

serverStatusLabel = new QLabel(tr("服务端就绪"));

startButton = new QPushButton(tr("接收"));

quitButton = new QPushButton(tr("退出"));

buttonBox = new QDialogButtonBox;

buttonBox->addButton(startButton, QDialogButtonBox::ActionRole);

buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole);

connect(startButton, SIGNAL(clicked()), this, SLOT(start()));

connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));

connect(&tcpServer, SIGNAL(newConnection()), this,

SLOT(acceptConnection()));

QVBoxLayout *mainLayout = new QVBoxLayout;

mainLayout->addWidget(serverProgressBar);

mainLayout->addWidget(serverStatusLabel);

mainLayout->addStretch(1);

mainLayout->addSpacing(10);

mainLayout->addWidget(buttonBox);

setLayout(mainLayout);

setWindowTitle(tr("接收文件"));

}

构造函数负责初始化界面,并将开始和退出按钮与各自的槽函数关联。这里还关联了QTcpServer 的newConnection()信号,该信号在有可用的TCP连接是发出。

void Dialog::start()

{

startButton->setEnabled(false);

QApplication::setOverrideCursor(Qt::WaitCursor);

bytesReceived = 0;

while (!tcpServer.isListening()

&& !tcpServer.listen(QHostAddress::LocalHost,16689)) {

QMessageBox::StandardButton ret = QMessageBox::critical(this,

tr("回环"),

tr("无法开始测试: %1.").arg(tcpServer.errorString()),

QMessageBox::Retry | QMessageBox::Cancel);

if (ret == QMessageBox::Cancel)

return;

}

serverStatusLabel->setText(tr("监听"));

}

当用户按下"接收"按钮后,start()函数开始执行,它调用QTcpServer的isListening()函数和listen()函数判断当前服务器是否已处在监听状态以及在本地16689端口建立监听是否成功。

如果一切正常,服务器端就已经成功监听,随时等待处理客户端的TCP连接请求,否则弹出错误信息,报告错误后返回。

void Dialog::acceptConnection()

{

tcpServerConnection = tcpServer.nextPendingConnection();

connect(tcpServerConnection, SIGNAL(readyRead()),

this, SLOT(updateServerProgress()));

connect(tcpServerConnection, SIGNAL(error(QAbstractSocket::SocketError)),

this, SLOT(displayError(QAbstractSocket::SocketError)));

serverStatusLabel->setText(tr("接受连接"));

tcpServer.close();

}

有客户端请求到来时,QTcpSocket类将会发出newConnection()信号,从而触发acceptConnection()函数。

QTcpServer类在接受了外来TCP连接请求后,可以通过nextPendingConnection()函数获取一个新的已建立连接的子套接字,(该套接字封装在QTcpSocket类中)并返回QTcpSocket类指针,将返回值保存在tcpServerConnection私有变量中。

接下来关联QTcpSocket类的readyRead()信号和error()信号,其中readyRead()信号在新连接中有可读数据时发出,而当新连接中产生错误是会发出error()信号。

由于本例只处理一个客户端请求,因此在返回一个连接后,就调用QTcpSocket类的close()函数关闭服务器端的监听,后面的工作均在新建的tcpServerConnection连接上完成。

void Dialog::updateServerProgress()

{

QDataStream in(tcpServerConnection);

in.setVersion(QDataStream::Qt_4_3);

if(bytesReceived <= sizeof(qint64)*2){

if((tcpServerConnection->bytesAvailable() >=

sizeof(qint64)*2)&&(fileNameSize ==0)){

in >> TotalBytes >> fileNameSize;

bytesReceived += sizeof(qint64)*2;

}

if((tcpServerConnection->bytesAvailable() >=

fileNameSize)&&(fileNameSize !=0)){

in >> fileName;

bytesReceived += fileNameSize;

localFile = new QFile(fileName);

if (!localFile->open(QFile::WriteOnly )) {

QMessageBox::warning(this, tr("应用程序"),

tr("无法读取文

件%1:\n%2.").arg(fileName).arg(localFile->errorString()));

return;

}

}else{

return;

}

}

if (bytesReceived < TotalBytes){

bytesReceived += tcpServerConnection->bytesAvailable();

inBlock = tcpServerConnection->readAll();

localFile->write(inBlock);

inBlock.resize(0);

}

serverProgressBar->setMaximum(TotalBytes);

serverProgressBar->setValue(bytesReceived);

qDebug()<

serverStatusLabel->setText(tr("已接收%1MB").arg(bytesReceived / (1024 * 1024)));

if (bytesReceived == TotalBytes) {

tcpServerConnection->close();

startButton->setEnabled(true);

QApplication::restoreOverrideCursor();

}

}

当建立的连接有新的可供读取的数据时,QTcpSocket类会发出readyRead()信号,从而触发updateServerProgress()函数。该函数完成数据的接收、存储,并更新进度显示。

首先将上面返回的TCP连接tcpServerConnection封装的QDataStream类型变量in中,同时设置流化数据格式类型为QDataStream::Qt_4_3,与客户端保持一致。现在可以很方便的通过重载后的"<<"操作符读取TCP连接上的数据了。

由于流数据是没有结构的,为了知道接收的文件名以及文件何时接收完毕,必须首先获取文件头结构,这里还有个小问题,由于开始时所传输文件名的长度是未知的,导致文件头结构的长度也是未知的,因此无法知道TCP数据流中前多少字节属于文件头结构部分。实际上文件头结构的接收可分两布完成:

1、从TCP数据流中接收前16个字节(两个qint64结构长),用来确定总共需接收的字节数和文件名长度,并将这两个值保存在私有成员TotalBytes和fileNameSize中,然后根据fileNameSize值接收文件名。值得注意的是,无法保证在上述接收文件头结构过程中,TCP连接上总是有足够的数据,因此在第一步中,需要通过tcpServerConnection->bytesAvailable() >= sizeof(qint64)*2) && (fileNameSize ==0)操作确保至少有16字节的可用数据且文件名长度为0(表示未从TCP连接接收文件名长度字段,仍处于第一步操作),然后调用in >> TotalBytes >> fileNameSize操作读取总共需接收的数据和文件名长度。

2、类似的通过(tcpServerConnection->bytesAvailable() >= fileNameSize) && (fileNameSize !=0)操作确保连接上的数据已包含完整的文件名且文件名长度不为0(表示已从TCP连接接收文件名长度字段,处于第二步操作中),然后调用in >> fileName操作读取文件名,并根据该文件名在本地以只写方式打开一个同名文件localFile,用来保存接收到的数据。

接下来的工作是读取实际的文件数据并保存,以及更新进度显示,直到接收到完全的数据。由于所发送的文件内容自身也是无格式的流,因此在接收文件内容时,只要TCP连接上有数据,就调用

tcpServerConnection->readAll()操作将当前全部可读数据读入接收缓冲inBlock中,随后再将该缓冲中的数据写入文件localFile中。当已收到的数据bytesReceived等于TotalBytes时,接收完毕,这时通过tcpServerConnection->close()操作关闭连接。

最后,错误处理函数displayError()和主函数main()与客户端程序类似,这里不再多说了~

通常QTcpSocket类和QTcpServer类以异步方式工作,但可以通过调用其waitFor...()类型的函数实现同步操作,这类操作将阻塞调用线程直到某个信号发出。

例如:在调用了非阻塞的QTcpSocket::connectToHost()函数后紧接着调用

QTcpSocket::waitForConnected()函数以阻塞调用线程,知道connected()信号发出。

一般而言,同步操作往往可以简化代码的控制流程,但也存在较大的缺点,调用waitFor...()函数将阻塞事件的处理,对于GUI线程会引起用户界面的冻结。

因此,Qt建议在GUI线程中不使用同步套接字,此时QTcpSocket也不在需要事件循环。

已经写了不少,累呀:( ,可是还有例子要举...

下一个例子,其实是想讲解一个Socket编程最为典型的例子程序了,自己写的聊天程序,这个例子主要讲解的是单服务器、多客户端进行的处理过程。

但是,由于一个字"懒"的原因,这里就只对服务端如何实现进行多客户端进行简短的讲解,其实在聊天程序的比较主要的知识点,在下面这个多线程网络程序中也涉及到了~~

现在让我们看看服务器包含的两个类:QCharServer和QCharClient。

QCharServer类继承了QServerSocker,QTcpServer类允许接受外来TCP连接,每当检测到外来TCP连接请求时,会自动调用QTcpServer::incomingConnection()函数,参数为标识socket ID的int型变量。

QCharServer* serverSocket = new QCharServer(this);

if (!serverSocket->listen(QHostAddress::Any, m_port))

{

QMessageBox::critical(this, tr("CharServer"),

tr("Unable To Start The Server: %1.")

.arg(serverSocket->errorString()));

serverSocket->close();

}

在主界面下创建和监听,等待客户端连接。

class QCharServer : public QTcpServer

{

Q_OBJECT

public:

QCharServer(QObject *parent = 0);

private:

void incomingConnection( int socketDescriptor );

signals:

void error(QTcpSocket::SocketError socketError);

};

QCharServer::QCharServer(QObject *parent)

: QTcpServer(parent)

{

}

void QCharServer::incomingConnection(int socketDescriptor)

{

QCharClient *socket = new QCharClient(this);

if (!socket->setSocketDescriptor(socketDescriptor))

{

emit error(socket->error());

return;

}

}

设置socketDescriptor并且将QCharClient保存到一个内部列表中,从而在任何时候,在内存中QCharClient对象的数量和正在服务的客户端数量都是一样的。

QCharClient继承了QTcpSocket并且封装了一个单独的客户端的状态。

class QCharClient : public QTcpSocket

{

Q_OBJECT

public:

QCharClient(QObject *parent = 0);

private slots:

void recvData();

void tryTest();

void clientDisconnected();

private:

void sendData();

};

QCharClient::QCharClient(QObject *parent)

: QTcpSocket(parent)

{

connect(this, SIGNAL(connected()), this, SLOT(clientConnected()));

connect(this, SIGNAL(readyRead()), this, SLOT(recvData()));

connect(this, SIGNAL(disconnected()), this, SLOT(clientDisconnected()));

}

void QCharClient::clientConnected()

{

...

}

void QCharClient::recvData()

{

QDataStream in(this);

char buffer[MAX_RECV_BUFFER_SIZE];

memset(buffer, 0, MAX_RECV_BUFFER_SIZE);

unsigned int len = in.readRawData(buffer, MAX_RECV_BUFFER_SIZE);

}

void QCharClient::clientDisconnected()

{

...

deleteLater();

}

void QCharClient::sendData()

{

QDataStream out(this);

char *buffer;

buffer = "vic.MINg";

int len = strlen( buffer );

out.writeRawData(buffer, len);

}

这里没有什么新内容,不做多废话了~

一个多线程的网络时间服务器,这个程序也是来自《精通Qt4编程》一书,每当由客户请求到达

时,这个服务器将启动一个新线程为它返回当前的时间,服务器完毕后这个线程将自动退出,同时用户界面会显示当前以接受请求的次数。

class TimeServer : public QTcpServer

{

Q_OBJECT

public:

TimeServer(QObject *parent = 0);

protected:

void incomingConnection(int socketDescriptor);

private:

Dialog *dlg;

};

首先需要实现一个TCP服务端类TimeServer,这里直接从QTcpServer类继承,并重写了其虚函数void incomingConnection( int socketDescriptor )。这个函数在TCP服务端有新的连接时被调用,参数这是界面指针,借用这个指针,将线程发出的消息关联到界面的槽函数中。

TimeServer::TimeServer(QObject *parent)

: QTcpServer(parent)

{

dlg = (Dialog*)parent;

}

构造函数十分简单,这里用传入的父类指针parent初始化私有变量dlg就可以了。

void TimeServer::incomingConnection(int socketDescriptor)

{

TimeThread *thread = new TimeThread(socketDescriptor,this);

connect(thread, SIGNAL(finished()), dlg,

SLOT(showResult()),Qt::QueuedConnection);

connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));

thread->start();

}

在重写的虚函数incomingConnection()中,首先以返回的套接字描述符socketDescriptor创建一个工作线程TimeThread,然后将这个线程的结束消息finished()分别关联到界面显示类的槽函数showResult()用于显示请求计数,以及线程自身的槽函数deleteLater()用于结束线程。

一切准备工作完成后启动这个线程。需要注意的是,在第一个connect操作中,使用了排队连接方式,第二个connect操作中使用了直接连接方式,原因在于前一个信号是跨线程的,后一个信号是在同一个线程中,当然也可以省略connect()函数的最后一个参数,而采用Qt的自动连接选择方式。

另一个需要注意的是,由于工作线程中存在网络事件,因此不能被外界线程销毁,这里使用了延迟销毁函数deleterLater()保证由工作线程自身销毁。

class TimeThread : public QThread

{

Q_OBJECT

public:

TimeThread(int socketDescriptor, QObject *parent);

void run();

signals:

void error(QTcpSocket::SocketError socketError);

private:

int socketDescriptor;

};

工作线程TimeThread由QThread类继承而来,这里将重写重要的虚函数run()。此外,还定义了一个出错信号void error(QTcpSocket::SocketError socketError)和一个私有的套接字描述符socketDescriptor。

TimeThread::TimeThread(int socketDescriptor,QObject *parent)

: QThread(parent), socketDescriptor(socketDescriptor)

{

}

构造函数十分简单,这里仅是初始化了私有套接字描述符。

void TimeThread::run()

{

QTcpSocket tcpSocket;

if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {

emit error(tcpSocket.error());

return;

}

QDateTime time;

QByteArray block;

QDataStream out(&block, QIODevice::WriteOnly);

out.setVersion(QDataStream::Qt_4_3);

uint time2u = QDateTime::currentDateTime().toTime_t();

out << time2u;

tcpSocket.write(block);

tcpSocket.disconnectFromHost();

tcpSocket.waitForDisconnected();

}

虚函数run()是工作线程的实质所在,当在TimeServer::incomingConnection()函数中调用了start()函数后,这个虚函数开始执行。它首先创建一个QTcpSocket类并置以从构造函数中传入的套接字描述符,用来向客户端传回服务器端的当前时间。如果出错,发出error(tcpSocket.error())信号报告错误;否则,开始获取当前时间并将它传回客户端,然后断开连接等待返回。

这里介绍以下时间数据的传输格式,Qt虽然可以很方便的通过QDateTime类的静态函数currentDateTime()获取一个时间对象,但类结构是无法直接在网络间传输的,此时需要将它转换成一个标准的数据类型后再传输。幸好的是QDateTime类提供了uint toTime_t() const函数,这个函数返回当前自1970-01-01 00:00:00经过了多少秒,为一个uint类型,可以将这个值传输给客户端。在客户端方面,使用QDateTime类void setTime_t(uint seconds)将这个时间还原。

class Dialog : public QDialog

{

Q_OBJECT

public:

Dialog(QWidget *parent = 0);

public slots:

void showResult();

private:

QLabel *statusLabel;

QLabel *reqStatusLable;

QPushButton *quitButton;

TimeServer *server;

int count;

};

界面类Dialog比较简单,它实际上就是一个对话框。在此定义了一个用于显示请求次数的槽函数void showResult(),以及用于显示监听端口的标签statusLabel,用于显示请求次数的标签reqStatusLabel,退出按钮quitButton,TCP服务器server和请求次数计数器count。

Dialog::Dialog(QWidget *parent)

: QDialog(parent),count(0)

{

server = new TimeServer(this);

statusLabel = new QLabel;

reqStatusLable = new QLabel;

quitButton = new QPushButton(tr("退出"));

quitButton->setAutoDefault(false);

if (!server->listen()) {

QMessageBox::critical(this, tr("多线程时间服务器"),

tr("无法启动服务器: %1.").arg(server->errorString()));

close();

return;

}

statusLabel->setText(tr("时间服务器运行在端口:%1.\n")

.arg(server->serverPort()));

connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));

QHBoxLayout *buttonLayout = new QHBoxLayout;

buttonLayout->addStretch(1);

buttonLayout->addWidget(quitButton);

buttonLayout->addStretch(1);

QVBoxLayout *mainLayout = new QVBoxLayout;

mainLayout->addWidget(statusLabel);

mainLayout->addWidget(reqStatusLable);

mainLayout->addLayout(buttonLayout);

setLayout(mainLayout);

setWindowTitle(tr("多线程时间服务器"));

}

构造函数Dialog完成了两件事,一件是初始化界面,另一件是启动服务器端的网络监听。

void Dialog::showResult()

{

reqStatusLable->setText(tr("第%1次请求完毕.\n").arg(++count));

}

槽函数showResult()功能十分简单,它在标签reqStatusLable上显示当前的请求次数,并将请求计数count加1。

OSI模型七个层的作用及工作原理

OSI模型七个层的作用及工作原理 OSI模型,即开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互联为网络的标准框架。OSI模型分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,在本文对这七个层的作用及工作原理做简单介绍。OSI/RM协议是由ISO(国际标准化组织)制订的,它的基本功能是:提供给开发者一个必需的、通用的概念以便开发完善、可以用来解释连接不同系统的框架。根据标准,OSI模型分七层,见图1,用这些规定来实现网络数据的传输。 图1 OSI模型

1、物理层(Physical Layer) OSI模型的最底层或第一层。该层包括物理联网媒介,如电缆连线连接器,主要是对物理连接方式、电气特性、机械特性等做一些规定,制订相关标准,这样大家就可以按照相同的标准开发出通用的产品,很明显直流24V与交流220V是无法对接的,因此就要统一标准,大家都用直流24V吧,至于为什么采用24V呢?您就当是争执各方妥协的结果吧。所以,这层标准解决的是数据传输所应用的设备标准的问题。 物理层的协议产生并检测电压,以便发送和接收携带数据的信号。尽管物理层不提供纠错服务,但它能够设定数据传输速率并监测数据出错率,网络物理问题,如电线断开,将影响物理层。用户要传递信息就要利用一些物理媒体,如双绞线、同轴电缆等,但具体的物理媒体并不在0SI的7层之内,有人把物理媒体当做第0层,物理层的任务就是为它的上一层提供一个物理连接,以及它们的机械、电气、功能和过程特性。如规定使用电缆和接头的类型、传送信号的电压等。在这一层,数据还没有被组织,仅作为原始的位流或电气电压处理,请注意,我们所说的通信仅仅指数字通信方式,因此,数据的单位是比特(位-bit)。 2、数据链路层(Datalink Layer) OSI模型的第二层。它控制网络层与物理层之间的通信,解决的是所传输的数据的准确性的问题。 数据链路层的主要功能是如何在不可靠的物理线路上进行数据的可

OSI七层模型与各层设备对应

O S I七层模型与各层设 备对应 -CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN

OSI七层模型与各层设备对应 OSI七层网络模型由下至上为1至7层,分别为物理层(Physical layer),数据链路层(Data link layer),网络层(Network layer),传输层(Transport layer),会话层(Session layer),表示层(Presentation layer),应用层(Application layer)。 应用层,很简单,就是应用程序。这一层负责确定通信对象,并确保由足够的资源用于通信,这些当然都是想要通信的应用程序干的事情。为操作系统或网络应用程序提供访问网络服务的接口。 应用层协议的代表包括:Telnet、FTP、HTTP、SNMP等。 表示层,负责数据的编码、转化,确保应用层的正常工作。这一层,是将我们看到的界面与二进制间互相转化的地方,就是我们的语言与机器语言间的转化。数据的压缩、解压,加密、解密都发生在这一层。这一层根据不同的应用目的将数据处理为不同的格式,表现出来就是我们看到的各种各样的文件扩展名。 会话层,负责建立、维护、控制会话,区分不同的会话,以及提供单工(Simplex)、半双工(Half duplex)、全双工(Full duplex)三种通信模式的服务。我们平时所知的NFS,RPC,X Windows等都工作在这一层。管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步。 传输层,负责分割、组合数据,实现端到端的逻辑连接。数据在上三层是整体的,到了这一层开始被分割,这一层分割后的数据被称为段(Segment)。三次握手(Three-way handshake),面向连接(Connection-Oriented)或非面向连接(Connectionless-Oriented)的服务,流控(Flow control)等都发生在这一层。是第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。 在这一层,数据的单位称为数据段(segment)。 传输层协议的代表包括:TCP、UDP、SPX等 网络层,负责管理网络地址,定位设备,决定路由。我们所熟知的IP地址和路由器就是工作在这一层。上层的数据段在这一层被分割,封装后叫做包(Packet),包有两种,一种叫做用户数据包(Data packets),是上层传下来的用户数据;另一种叫路由更新包(Route update packets),是直接由路由器发出来的,用来和其他路由器进行路由信息的交换。负责对子网间的数据包进行路由选择。网络层还可以实现拥塞控制、网际互连等功能。

osi七层模型各层的功能

OSI 七层模型各层的功能。 OSI 七层模型各层的功能。第七层:应用层数据用 户接口,提供用户程序“接口”。 第六层:表示层数据数据的表现形式,特定功能的实现,如数据加密。 第五层:会话层数据允许不同机器上的用户之间建立会话 关系,如WINDOWS 第四层:传输层段实现网络不同主机上用户进程之间的数 与不可靠的传输,传输层的错误检测,流量控制等。 第三层:网络层包提供逻辑地址(IP)、选路,数据从源端 到目的端的传输第二层:数据链路层帧将上层数据封装成帧,用MAC 地址访问媒介,错误检测与修正。 第一层:物理层比特流设备之间比特流的传输,物理接口,电气特性等。下面是对OSI 七层模型各层功能的详细解释: OSI 七层模型OSI 七层模型称为开放式系统互联参考模型 OSI 七层模型是一种框架性的设计方法 OSI 七层模型通过七个层次化的结构模型使不同的系统不

同的网络之间实现可靠的通讯,因此其最主要的功能使就是帮助不同类型的主机实现数据传输物理层:O S I 模型的最低层或第一层,该层包括物理连 网媒介,如电缆连线连接器。物理层的协议产生并检测电压络接口卡,你就建立了计算机连网的基础。换言之,你提供了一个物理层。尽管物理层不提供纠错服务,但它能够设定数据传输速率并监测数据出错率。网络物理问题,如电线断开,将影响物理层。 以便发送和接收携带数据的信号。在你的桌面P C 上插入网 数据链路层:O S I 模型的第二层,它控制网络层与物理层之间的通信。它的主要功能是如何在不可靠的物理线路上进行数据的可靠传递。为了保证传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。帧是用来移动数据的结构包,它不仅包括原始数据,还包括发送方和接收方的网络地址以及纠错和控制信息。其中的地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。 数据链路层的功能独立于网络和它的节点和所采用的物理层类型,它也不关心是否正在运行Wo r d 、E x c e l 或使用I n t e r n e t 。有一些连接设备,如交换机,由于它们要对帧解码并使用帧信息将数据发送到正确的接收方,所以它们是工作在数据链路层的。 网络层:O S I 模型的第三层,其主要功能是将网络地址翻

开放系统互联参考模型

开放系统互联参考模型 开放系统互联参考模型篇一 互联网OSI开放系统互联参考模型集线器也叫Hub,工作在物理层(最底层),没有匹配的软件系统,是纯硬件设备。 集线器主要用来连接计算机等网络终端。 集线器实际就是一种多端口的中继器。 中继器的作用就是将已经衰减得不完整的信号经过整理,重新产生出完整的信号再继续传送。 集线器为共享带宽,连接在集线器上的任何一个设备发送数据时,其他所有设备必须等待,此设备享有全部带宽,通讯完毕,再由其他设备使用带宽。 正因此,集线器连接了一个冲突的网络。 所有设备相互交替使用,就好像大家一起过一根独木桥一样。 集线器不能判断数据包的目的和类型,所以如果是广播数据包也依然转发,而且所有设备发出数据以广播方式发送到每个接口,这样集线器也连接了一个广播域的网络。 数据链路层:产品代表交换机。 交换机——交换机Switch,工作在数据链路层(第二层),稍微高端一点的交换机都有一个操作系统来支持。 和集线器一样主要用于连接计算机等网络终端设备。 交换机比集线器更加先进,允许连接在交换机上的设备并行通讯,好比高速公路上的汽车并行行驶一般,设备间通讯不会发生冲突,因此交换机打破了冲突域,交换机每个接口是一个冲突域,不会与其他接口发生通讯冲突。 并且有系统的交换机可以记录MAC地址表,发送数据不会以广播的方式发送到每个接口,而是直接到目的接口,节省了接口带宽。 但是交换机和集线器一样不能判断广播数据包,会把广播发送到全部接口,所以交换机和集线器一样连接了一个广播域网络。 在计算机网络系统中,交换机是针对共享工作模式的弱点而推出的。 集线器是采用共享工作模式的代表,如果把集线器比作一个邮递员,那么这个邮递员是个不认识字的“傻瓜”--要他去送信,他不知道直接根据信件上的地址将信件送给收信人,只会拿着信分发给所有的人,然后让接收的人根据地址信息来判断是不是自己的!而交换机则是一个“聪明”的邮递员--交换机拥有一条高带宽的背部总线和内部交换矩阵。 交换机的所有的端口都挂接在这条背部总线上,当控制电路收到数据包以后,处理端口会查找内存中的地址对照表以确定目的MAC(网卡的硬件地址)的NIC(网卡)挂接在哪个端口上,通过内部交换矩阵迅速将数据包传送到目的端口。 目的MAC若不存在,交换机才广播到所有的端口,接收端口回应后交换机会“学习”新的地址,并把它添加入内部地址表中。 网络层:产品代表路由器。 路由器——路由器Router,工作在网络层(第三层),所有路由器都有自己的操作系统来维持,并且需要人员调试,否则不能工作。 路由器没有那么多接口,主要用来进行网络与网络的连接。 简单的说路由器把数据从一个网络发送到另一个网络,这个过程就叫路由。 路由器不仅能像交换机一样隔离冲突域,而且还能检测广播数据包,并丢弃广播包来隔离广播域,有效的扩大了网络的规模。 在路由器中记录着路由表,路由器以此来转发数据,以实现网络间的通讯。 路由器的介入可以交换机划分的VLAN实现互相通讯。

OSI七层模型基础知识及各层常见应用要点

OSI Open Source Initiative(简称OSI,有译作开放源代码促进会、开放原始码组织)是一个旨在推动开源软件发展的非盈利组织。OSI参考模型(OSI/RM)的全称是开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它是由国际标准化组织ISO提出的一个网络系统互连模型。它是网络技术的基础,也是分析、评判各种网络技术的依据,它揭开了网络的神秘面纱,让其有理可依,有据可循。 一、OSI参考模型知识要点 图表1:OSI模型基础知识速览 模型把网络通信的工作分为7层。1至4层被认为是低层,这些层与数据移动密切相关。5至7层是高层,包含应用程序级的数据。每一层负责一项具体的工作,然后把数据传送到下一层。由低到高具体分为:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 第7层应用层—直接对应用程序提供服务,应用程序可以变化,但要包括电子消息传输 第6层表示层—格式化数据,以便为应用程序提供通用接口。这可以包括加

密服务 第5层会话层—在两个节点之间建立端连接。此服务包括建立连接是以全双工还是以半双工的方式进行设置,尽管可以在层4中处理双工方式第4层传输层—常规数据递送-面向连接或无连接。包括全双工或半双工、流控制和错误恢复服务 第3层网络层—本层通过寻址来建立两个节点之间的连接,它包括通过互连网络来路由和中继数据 第2层数据链路层—在此层将数据分帧,并处理流控制。本层指定拓扑结构并提供硬件寻址 第1层物理层—原始比特流的传输 电子信号传输和硬件接口数据发送时,从第七层传到第一层,接受方则相反。 各层对应的典型设备如下: 应用层……………….计算机:应用程序,如FTP,SMTP,HTTP 表示层……………….计算机:编码方式,图像编解码、URL字段传输编码 会话层……………….计算机:建立会话,SESSION认证、断点续传 传输层……………….计算机:进程和端口 网络层…………………网络:路由器,防火墙、多层交换机 数据链路层………..网络:网卡,网桥,交换机 物理层…………………网络:中继器,集线器、网线、HUB 二、OSI基础知识 OSI/RM参考模型的提出 世界上第一个网络体系结构由IBM公司提出(74年,SNA),以后

OSI七层模型与各层设备对应

OSI七层模型与各层设备对应 OSI七层网络模型由下至上为1至7层,分别为物理层(Physical layer),数据链路层(Data link layer),网络层(Network layer),传输层(Transport layer),会话层(Session layer),表示层(Presentation layer),应用层(Application layer)。 应用层,很简单,就是应用程序。这一层负责确定通信对象,并确保由足够的资源用于通信,这些当然都是想要通信的应用程序干的事情。为操作系统或网络应用程序提供访问网络服务的接口。 应用层协议的代表包括:Telnet、FTP、HTTP、SNMP等。 表示层,负责数据的编码、转化,确保应用层的正常工作。这一层,是将我们看到的界面与二进制间互相转化的地方,就是我们的语言与机器语言间的转化。数据的压缩、解压,加密、解密都发生在这一层。这一层根据不同的应用目的将数据处理为不同的格式,表现出来就是我们看到的各种各样的文件扩展名。 会话层,负责建立、维护、控制会话,区分不同的会话,以及提供单工(Simplex)、半双工(Half duplex)、全双工(Full duplex)三种通信模式的服务。我们平时所知的NFS,RPC,X Windows等都工作在这一层。管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步。 传输层,负责分割、组合数据,实现端到端的逻辑连接。数据在上三层是整体的,到了这一层开始被分割,这一层分割后的数据被称为段(Segment)。三次握手(Three-way handshake),面向连接(Connection-Oriented)或非面向连接(Connectionless-Oriented)的服务,流控(Flow control)等都发生在这一层。是第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。 在这一层,数据的单位称为数据段(segment)。 传输层协议的代表包括:TCP、UDP、SPX等 网络层,负责管理网络地址,定位设备,决定路由。我们所熟知的IP地址和路由器就是工作在这一层。上层的数据段在这一层被分割,封装后叫做包(Packet),包有两种,一种叫做用户数据包(Data packets),是上层传下来的用户数据;另一种叫路由更新包(Route update packets),是直接由路由器发出来的,用来和其他路由器进行路由信息的交换。负责对子网间的数据包进行路由选择。网络层还可以实现拥塞控制、网际互连等功能。 在这一层,数据的单位称为数据包(packet)。 网络层协议的代表包括:IP、IPX、RIP、OSPF等 数据链路层,负责准备物理传输,CRC校验,错误通知,网络拓扑,流控等。我们所熟知的MAC地址和交换机都工作在这一层。上层传下来的包在这一层被分割封装后叫做帧(Frame)。在不可靠的物理介质上提供可靠的传输。该层的作用

开放系统互连参考模型

OSI七层模型工作原理 开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。 它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。其中前三层主要与网络应用相关,负责对用户数据进行编码等操作。后四层主要是负责网络通讯,负责将用户的数据传递到目的地。在通讯的过程中,各层所负责的情各不相同,也不会互相干扰,但会协同一起工作,最终完成整个通讯过程,将数据正确的交到对方电脑中。其各层功能如下: 1.物理层的主要功能是利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。传输单位为比特(bit),即一个二进制位(0或1)。这些比特的传输必须依赖于传输设备和物理线缆等媒介。典型设备有中继器,集线器、网线、HUB。 2.数据链路层负责建立和管理节点间的链路。该层的主要功能是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。 数据链路层主要有四个功能: (1)协商:两端设备连接上线缆之后,设备默认是不知道对端使用的是什么协议的,会 通过数据链路层发送协商包来确认对端是否与自己的协议一致; (2)流量控制 (3)差错控制:当数据封装到数据链路层时,会作一个校验,然后再传到对端,对 端接收下来之后,也会作一个校验,以确认数据传递过来的时候是一个正常的数据。 (4)物理寻址:在数据链路层中,有很多种二层的协议中都有地址,比如以太网的mac地址,Frame-Relay的DLCI等等。 其典型设备有网卡,网桥,交换机。 3.网络层是通信子网的最高一层。它在下两层的基础上向资源子网提供服务。其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。该层控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。其主要设备有路由器,防火墙、多层交换机。 4.传输层是是通信子网和资源子网的接口和桥梁,起到承上启下的作用。该层的主要任务是:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。传输层的作用是向高层屏蔽下层数据通信的细节,即向用户透明地传送报文。传输层提供会话层和网络层之间的传输服务,这种服务从会话层获得数据,并在必要时,对数据进行分割。然后,传输层将数据传递到网络层,并确保数据能正确无误地传送到网络层。因此,传输层负责提供两节点之间数据的可靠传送,当两节点的联系确定之后,传输层则负责监督工作。其主要工作设备是进程和端口。 5.会话层是用户应用程序和网络之间的接口,主要任务是:向两个实体的表示层提供建立和使用连接的方法。将不同实体之间的表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。会话层,主要功能是用来管理会话,细分为三大功能: (1)建立连接。A、B两台电脑要通讯,首先必须建立一条他们之间的连接,osi会话层 会完成这个步骤。 (2)保持连接。连接建立后,当、B通讯完了。A、B之间的连接不会立刻断开,osi会话层会将建立好了的连接维持一段时间不中断,当A、B下次还要通讯时,可以直接使用之前

网络osi七层模型各层功能总结

1. 物理层 在OSI参考模型中,物理层(Physical Layer)是参考模型的最低层,也是OSI模型的第一层。 物理层的主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。 物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。需要注意的是,物理层并不是指连接计算机的具体物理设备或传输介质,如双绞线、同轴电缆、光纤等,而是要使其上面的数据链路层感觉不到这些差异,这样可使数据链路层只需要考虑如何完成本层的协议和服务,而不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的,当然,物理层并不需要知道哪几个比特代表什么意思。 为了实现物理层的功能,该层所涉及的内容主要有以下几个方面: (1)通信连接端口与传输媒体的物理和电气特性 λ机械特性:规定了物理连接器的现状、尺寸、针脚的数量,以及排列状况等。例如EIA-RS-232-D标准规定使用25根引脚的DB-25插头座,其两个固定螺丝之间的距离为47.04±0.17mm等。 λ电气特性:规定了在物理连接信道上传输比特流时的信号电平、数据编码方式、阻抗及其匹配、传输速率和连接电缆最大距离的限制等。例如EIA-RS-232-D标准采用负逻辑,即逻辑0(相当于数据“0”)或控制线处于接通状态时,相对信号的地线有+5~+15V的电压;当其连接电缆不超过15米时,允许的传输速率不超过20Kb/s。 λ功能特性:规定了物理接口各个信号线的确切功能和含义,如数据线和控制线等。例如EIA-RS-232-D 标准规定的DB-25插头座的引脚2和引脚3均为数据线。λ规程特性:利用信号线进行比特流传输时的操作过程,例如信号线的工作规则和时序等。 (2)比特数据的同步和传输方式 物理层指定收发双方在传输时使用的传输方式,以及为保持双方步调一致而采用的同步技术。例如在采用串行传输时,其同步技术是采用同步传输方式还是异步传输方式。(3)网络的物理拓扑结构 物理拓扑规定了节点之间外部连接的方式。例如星形拓扑、总线型拓扑、环形拓扑和网状拓扑等。 (4)物理层完成的其他功能 λ数据的编码。 调制技术。λ 通信接口标准。λ 2. 数据链路层 数据链路层(Data Link Layer)是OSI模型的第二层,负责建立和管理节点间的链路。该层的主要功能是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。(交换机) 在计算机网络中由于各种干扰的存在,物理链路是不可靠的。因此,这一层的主要功能是在物理层提供的比特流的基础上,通过差错控制、流量控制方法,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。 该层通常又被分为介质访问控制(MAC)和逻辑链路控制(LLC)两个子层。MAC子层的主要任务是解决共享型网络中多用户对信道竞争的问题,完成网络介质的访问控制;LLC子层的主要任务是建立和维护网络连接,执行差错校验、流量控制和链路控制。 数据链路层的具体工作是接收来自物理层的位流形式的数据,并加工(封装)成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层;并且,还负责处理接收端发回的确认帧的信息,以便提供可靠的数据传输。数据链路层的主要功能如下: λ数据帧的处理:处理数据帧的封装与分解。 λ物理地址寻址:通过数据帧头部中的物理地址信息,建立源节点到目的节点的数据链路,并进行维护与释放链路的管理工作。 λ流量控制:对链路中所发送的数据帧的速率进 行控制,以达到数据帧流量控制的目的。 λ帧同步:对数据帧的传输顺序进行控制(即帧 的同步和顺序控制)。 λ差错检测与控制:通常在帧的尾部加入用于差 错控制的信息,并采用检错检测和重发式的差错控制技 术。例如处理接收端发回的确认帧。 3. 网络层 网络层(Network Layer)是OSI模型的第三层,它是OSI 参考模型中最复杂的一层,也是通信子网的最高一层。它 在下两层的基础上向资源子网提供服务。其主要任务是: 通过路由选择算法,为报文或分组通过通信子网选择最适 当的路径。该层控制数据链路层与传输层之间的信息转 发,建立、维持和终止网络的连接。具体地说,数据链路 层的数据在这一层被转换为数据包,然后通过路径选择、 分段组合、顺序、进/出路由等控制,将信息从一个网络 设备传送到另一个网络设备。 一般地,数据链路层是解决同一网络内节点之间的通信, 而网络层主要解决不同子网间的通信。例如在广域网之间 通信时,必然会遇到路由(即两节点间可能有多条路径) 选择问题。在实现网络层功能时,需要解决的主要问题如 下: λ寻址:数据链路层中使用的物理地址(如MAC 地址)仅解决网络内部的寻址问题。在不同子网之间通信 时,为了识别和找到网络中的设备,每一子网中的设备都 会被分配一个唯一的地址。由于各子网使用的物理技术可 能不同,因此这个地址应当是逻辑地址(如IP地址)。 λ交换:规定不同的信息交换方式。常见的交换 技术有:线路交换技术和存储转发技术,后者又包括报文 交换技术和分组交换技术。 λ路由算法:当源节点和目的节点之间存在多条 路径时,本层可以根据路由算法,通过网络为数据分组选 择最佳路径,并将信息从最合适的路径由发送端传送到接 收端。 λ连接服务:与数据链路层流量控制不同的是, 前者控制的是网络相邻节点间的流量,后者控制的是从源 节点到目的节点间的流量。其目的在于防止阻塞,并进行 差错检测。 4. 传输层 OSI下3层的主要任务是数据通信,上3层的任务是数据 处理。而传输层(Transport Layer)是OSI模型的第4 层。因此该层是通信子网和资源子网的接口和桥梁,起到 承上启下的作用。 该层的主要任务是:向用户提供可靠的端到端的差错和流 量控制,保证报文的正确传输。传输层的作用是向高层屏 蔽下层数据通信的细节,即向用户透明地传送报文。该层 常见的协议:TCP/IP中的TCP协议、Novell网络中的SPX 协议和微软的NetBIOS/NetBEUI协议。 传输层提供会话层和网络层之间的传输服务,这种服务从 会话层获得数据,并在必要时,对数据进行分割。然后, 传输层将数据传递到网络层,并确保数据能正确无误地传 送到网络层。因此,传输层负责提供两节点之间数据的可 靠传送,当两节点的联系确定之后,传输层则负责监督工 作。综上,传输层的主要功能如下: λ传输连接管理:提供建立、维护和拆除传输连 接的功能。传输层在网络层的基础上为高层提供“面向连 接”和“面向无接连”的两种服务。 λ处理传输差错:提供可靠的“面向连接”和不 太可靠的“面向无连接”的数据传输服务、差错控制和流 量控制。在提供“面向连接”服务时,通过这一层传输的 数据将由目标设备确认,如果在指定的时间内未收到确认 信息,数据将被重发。 λ监控服务质量。 5. 会话层 会话层(Session Layer)是OSI模型的第5层,是用户 应用程序和网络之间的接口,主要任务是:向两个实体的 表示层提供建立和使用连接的方法。将不同实体之间的表 示层的连接称为会话。因此会话层的任务就是组织和协调 两个会话进程之间的通信,并对数据交换进行管理。 用户可以按照半双工、单工和全双工的方式建立会话。当 建立会话时,用户必须提供他们想要连接的远程地址。而 这些地址与MAC(介质访问控制子层)地址或网络层的逻 辑地址不同,它们是为用户专门设计的,更便于用户记忆。 域名(DN)就是一种网络上使用的远程地址例如: https://www.sodocs.net/doc/e916070812.html,就是一个域名。会话层的具体功能如下: λ会话管理:允许用户在两个实体设备之间建 立、维持和终止会话,并支持它们之间的数据交换。例如 提供单方向会话或双向同时会话,并管理会话中的发送顺 序,以及会话所占用时间的长短。 λ会话流量控制:提供会话流量控制和交叉会话 功能。 寻址:使用远程地址建立会话连接。λ λ出错控制:从逻辑上讲会话层主要负责数据交 换的建立、保持和终止,但实际的工作却是接收来自传输 层的数据,并负责纠正错误。会话控制和远程过程调用均 属于这一层的功能。但应注意,此层检查的错误不是通信 介质的错误,而是磁盘空间、打印机缺纸等类型的高级错 误。 6. 表示层 表示层(Presentation Layer)是OSI模型的第六层,它 对来自应用层的命令和数据进行解释,对各种语法赋予相 应的含义,并按照一定的格式传送给会话层。其主要功能 是“处理用户信息的表示问题,如编码、数据格式转换和 加密解密”等。表示层的具体功能如下: λ数据格式处理:协商和建立数据交换的格式, 解决各应用程序之间在数据格式表示上的差异。 λ数据的编码:处理字符集和数字的转换。例如 由于用户程序中的数据类型(整型或实型、有符号或无符 号等)、用户标识等都可以有不同的表示方式,因此,在 设备之间需要具有在不同字符集或格式之间转换的功能。 λ压缩和解压缩:为了减少数据的传输量,这一 层还负责数据的压缩与恢复。 数据的加密和解密:可以提高网络的安全性。λ 7. 应用层 应用层(Application Layer)是OSI参考模型的最高层, 它是计算机用户,以及各种应用程序和网络之间的接口, 其功能是直接向用户提供服务,完成用户希望在网络上完 成的各种工作。它在其他6层工作的基础上,负责完成网 络中应用程序与网络操作系统之间的联系,建立与结束使 用者之间的联系,并完成网络用户提出的各种网络服务及 应用所需的监督、管理和服务等各种协议。此外,该层还 负责协调各个应用程序间的工作。 应用层为用户提供的服务和协议有:文件服务、目录服务、 文件传输服务(FTP)、远程登录服务(Telnet)、电子 邮件服务(E-mail)、打印服务、安全服务、网络管理服 务、数据库服务等。上述的各种网络服务由该层的不同应 用协议和程序完成,不同的网络操作系统之间在功能、界 面、实现技术、对硬件的支持、安全可靠性以及具有的各 种应用程序接口等各个方面的差异是很大的。应用层的主 要功能如下: λ用户接口:应用层是用户与网络,以及应用程 序与网络间的直接接口,使得用户能够与网络进行交互式 联系。 λ实现各种服务:该层具有的各种应用程序可以 完成和实现用户请求的各种服务。 8. 7层模型的小结 由于OSI是一个理想的模型,因此一般网络系统只涉及其 中的几层,很少有系统能够具有所有的7层,并完全遵循 它的规定。 在7层模型中,每一层都提供一个特殊的网络功能。从网 络功能的角度观察:下面4层(物理层、数据链路层、网 络层和传输层)主要提供数据传输和交换功能,即以节点 到节点之间的通信为主;第4层作为上下两部分的桥梁, 是整个网络体系结构中最关键的部分;而上3层(会话层、 表示层和应用层)则以提供用户与应用程序之间的信息和 数据处理功能为主。简言之,下4层主要完成通信子网的 功能,上3层主要完成资源子网的功能。 9. 建立OSI参考模型的目的和作用 建立OSI参考模型的目的除了创建通信设备之间的物理 通道之外,还规划了各层之间的功能,并为标准化组织和 生产厂家制定了协议的原则。这些规定使得每一层都具有 一定的功能。从理论上讲,在任何一层上符合OSI标准的 产品都可以被其他符合标准的产品所取代。因此,OSI参 考模型的基本作用如下: λ OSI的分层逻辑体系结构使得人们可以深刻地 理解各层协议所应解决的问题,并明确各个协议在网络体 系结构中所占据的位置。 λ OSI参考模型的每一层在功能上与其他层有着 明显的区别,从而使得网络系统可以按功能划分。这样, 网络或通信产品就不必面面俱到。例如,当某个产品只需 完成某一方面的功能时,它可以只考虑并遵循所涉及层的 标准。 λ OSI参考模型有助于分析和了解每一种比较复 杂的协议。 以后还会介绍其他参考模型或协议,例如TCP/IP、IEEE 802和X.25协议等,因此,还会比较它们与OSI模型的 关系,从而使读者进一步理解网络体系结构、模型和各种 协议的工作原理。

OSI七层模型各层分别有哪些协议及它们的功能

OSI七层模型各层分别有哪些协议及它们 的功能 在互联网中实际使用的是TCP/IP参考模型。实际存在的协议主要包括在:物理层、数据链路层、网络层、传输层和应用层。各协议也分别对应这5个层次而已。 要找出7个层次所对应的各协议,恐怕会话层和表示层的协议难找到啊。。 应用层 ·DHCP(动态主机分配协议) · DNS (域名解析) · FTP(File Transfer Protocol)文件传输协议 · Gopher (英文原义:The Internet Gopher Protocol 中文释义:(RFC-1436)网际Gopher协议)· HTTP (Hypertext Transfer Protocol)超文本传输协议 · IMAP4 (Internet Message Access Protocol 4) 即 Internet信息访问协议的第4版本· IRC (Internet Relay Chat )网络聊天协议 · NNTP (Network News Transport Protocol)

RFC-977)网络新闻传输协议 · XMPP 可扩展消息处理现场协议 · POP3 (Post Office Protocol 3)即邮局协议的第3个版本 · SIP 信令控制协议 · SMTP (Simple Mail Transfer Protocol)即简单邮件传输协议 · SNMP (Simple Network Management Protocol,简单网络管理协议) · SSH (Secure Shell)安全外壳协议 · TELNET 远程登录协议 · RPC (Remote Procedure Call Protocol)(RFC-1831)远程过程调用协议 · RTCP (RTP Control Protocol)RTP 控制协议 · RTSP (Real Time Streaming Protocol)实时流传输协议 · TLS (Transport Layer Security Protocol)安全传输层协议 · SDP( Session Description Protocol)会话描述协议 · SOAP (Simple Object Access Protocol)

OSI七层协议模型

OSI七层协议模型 OSI 参考模型表格 OSI的七层结构 第一层:物理层(PhysicalLayer) 规定通信设备的机械的、电气的、功能的和过程的特性,用以建立、维护和拆除物理链路连接。具体地讲,机械特性规定了网络连接时所需接插件的规格尺寸、引脚数量和排列情况等;电气特性规定了在物理连接上传输bit流时线路上信号电平的大小、阻抗匹配、传输速率距离限制等;功能特性是指对各个信号先分配确切的信号含义,即定义了DTE和DCE之间各个线路的功能;过程特性定义了利用信号线进行bit流传输的一组操作规程,是指在物理连接的建立、维护、交换信息时,DTE和DCE双方在各电路上的动作系列。 在这一层,数据的单位称为比特(bit)。

属于物理层定义的典型规范代表包括:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45等。 物理层的主要功能: 为数据端设备提供传送数据的通路,数据通路可以是一个物理媒体,也可以是多个物理媒体连接而成.一次完整的数据传输,包括激活物理连接,传送数据,终止物理连接.所谓激活,就是不管有多少物理媒体参与,都要在通信的两个数据终端设备间连接起来,形成一条通路. 传输数据.物理层要形成适合数据传输需要的实体,为数据传送服务. 一是要保证数据能在其上正确通过,二是要提供足够的带宽(带宽是指每秒钟内能通过的比特(BIT)数),以减少信道上的拥塞.传输数据的方式能满足点到点,一点到多点,串行或并行,半双工或全双工,同步或异步传输的需要. 完成物理层的一些管理工作. 物理层的主要设备:中继器、集线器。 第二层:数据链路层(DataLinkLayer) 在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧(Frame)在信道上无差错的传输,并进行各电路上的动作系列。 数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。 在这一层,数据的单位称为帧(frame)。 数据链路层协议的代表包括:SDLC、HDLC、PPP、STP、帧中继等。 链路层的主要功能: 链路层是为网络层提供数据传送服务的,这种服务要依靠本层具备的 功能来实现。链路层应具备如下功能: 链路连接的建立,拆除,分离。 帧定界和帧同步。链路层的数据传输单元是帧,协议不同,帧的长短和界面也有差别,但无论如何必须对帧进行定界。 顺序控制,指对帧的收发顺序的控制。 差错检测和恢复。还有链路标识,流量控制等等.差错检测多用方阵码校验和循环码校验来检测信道上数据的误码,而帧丢失等用序号检测.各种错误的恢复则常靠反馈重发技术来完成。 数据链路层主要设备:二层交换机、网桥 第三层是网络层(Network layer) 在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点,确保数据及时传送。网络层将解封装数据链路层收到的

1、OSI(开放系统互联)参考模型的最底层是( )。

1、OSI(开放系统互联)参考模型的最底层是()。 A、传输层 B、网络层 C、物理层 D、应用层 2、网络资源共享包括硬件,软件,()。 A、设备 B、数据 C、应用 D、操作系统 3、计算机网络是计算机技术与()技术相结合的产物。 A、网络 B、通信 C、软件 D、信息 4、同步和异步通信都属于()方式。 A、串行 B、并行 C、复用 D、网络 5、数据传输速率的单位是()。 A、字节 B、位 C、汉字 D、帧 6、数据传送速率的单位是每秒()。 A、字节 B、比特 C、汉字 D、帧 7、调制是指()。 A、把模拟信号转为数字信号 B、把数字信号转为模拟信号 C、把光信号转为电信号 D、把电信号转为光信号 8、同步比异步通信传输速率()。 A、快 B、慢 C、相同 D、可快可慢 9、计算机网络的功能是资源共享,(),分布式处理,方便可靠。 A、数据传送 B、软件下载 C、电子邮件 D、电子商务 10、同步和异步通信都属于()方式。 A、串行 B、并行 C、复用 D、网络 11、数据通信方式分为单工,双工,()。 A、广播 B、半双工 C、共享 D、应答 12、OSI参考模型分为()层。 A、3 B、5 C、7 D、9 13、OSI参考模型的最低层为()。 A、应用层 B、网络层 C、物理层 D、数据链路层 14、OSI参考模型的最高层为()。 A、表示层 B、会话层 C、物理层 D、应用层 15、通过HUB连接的网络拓扑结构是()。

A、总线型 B、环型 C、星型 D、数型 16、组成局域网的网络硬件可分为服务器、工作站和()。 A、微机 B、通信系统 C、连接电缆 D、网关 17、通常所说OSI模型分为()。 A、6层 B、2层 C、4层 D、7层 18、OSI模型中最底层和最高层分别为()。 A、物理层和表示层 B、网络层和应用层 C、物理层和应用层 D、网络层和表示层 19、当个人计算机以拨号方式接入Internet网时,必须使用的设备是()。 A、网卡 B、调制解调器(Modem) C、电话机 D、浏览器软件 20、因特网服务采用()模式。 A、Client(客户)/server(服务器) B、文件服务器 C、打印服务器 D、数据库服务器 21、Internet的通信协议是()。 A、SMTP B、CSMA/CD C、POP D、TCP/IP 22、Internet采用()网络结构。 A、文件服务 B、数据库服务 C、客户/服务器 D、打印服务 23、HomePage指WWW站点的()。 A、网页 B、主页 C、任意页 D、名称 24、Internet互连网的概念叙述错误的是()。 A、Internet即国际互连网 B、Internet具有网络资源共享的特点 C、在中国称为因特网 D、Internet是局域网的一种 25、Internet的缺点是()。 A、不够安全 B、不能传输文件 C、不能实现现场对话 D、不能传输声音 26、Internet采用的通信协议是()。 A、TCP B、TCP/IP C、IP D、T/P 27、Internet提供多种服务,应用最广泛为()。 A、Telnet B、Gopher C、E-mail D、TCP/IP

ISO七层模型的定义及功能

《计算机网络基础》课程上机作业 题目: IOS七层协议的定义及功能 姓名:学号: 班级: 完成日期: 任课教师:

XX学院 学院:专业:姓名:学号: 授课老师: 作业题目:IOS七层协议的定义及功能 一、OSI七层模型介绍 答:OSI是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范。OSI模型有7层结构,每层都可以有几个子层。下面我简单的介绍一下这7层及其功能。 (一)OSI的7层从上到下分别是 7、应用层 6、表示层 5、会话层 4、传输层 3、网络层 2、数据链路层 1、物理层 其中高层,既7、6、5、4层定义了应用程序的功能,下面3层,既3、2、1层主要面向通过网络的端到端的数据流。下面我给大家介绍一下这7层的功能:

(二)各层的定义及功能: (1)应用层:与其他计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。示例:telnet,HTTP,FTP,WWW,NFS,SMTP等。 (2)表示层:这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASII格式,发送方将把文本从发送方的字符集转换成标准的ASII后发送数据。在接收方将标准的ASII转换成接收方计算机的字符集。示例:加密,ASII等。 (3)会话层:他定义了如何开始、控制和结束一个会话,包括对多个双向小时的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。 (4)传输层:这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。 (5)网络层:这层对端到端的包传输进行定义,他定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大

OSI七层模型中各层分别对应的协议

OSI七层模型中各层分别对应的协议谈到网络不能不谈OSI参考模型,OSI参考模型(OSI/RM)的全称是开放系统互联参考模型(Open System Interconnection Reference Model,OSI/RM),它是由国际标准化组织ISO提出的一个网络系统互连模型。虽然OSI参考模型的实际应用意义不是很大,但其的确对于理解网络协议内部的运作很有帮助,也为我们学习网络协议提供了一个很好的参考。 1.物理层 物理层规定了激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。该层为上层协议提供了一个传输数据的物理媒体。在这一层,数据的单位称为比特(bit)。 属于物理层定义的典型规范代表包括:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45等。 2.数据链路层 数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。在这一层,数据的单位称为帧(frame)。 数据链路层协议的代表包括:SDLC(同步数据链路控制)、HDLC (高级数据链路控制)、PPP(点对点协议)、STP(生成树协议)、帧中继等。 3.网络层

网络层负责对子网间的数据包进行路由选择。网络层还可以实现拥塞控制、网际互连等功能。在这一层,数据的单位称为数据包(packet)。 网络层协议的代表包括:IP(网络之间互联的协议)、IPX(互联网数据包交换协议)、RIP(路由信息协议)、OSPF(开放式最短路径优先)等。 4.传输层 传输层是第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。在这一层,数据的单位称为数据段(segment)。 传输层协议的代表包括:TCP(传输控制协议)、UDP(用户数据报协议)、SPX(序列分组交换协议)等。 5.会话层 会话层管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步。 6.表示层 表示层对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等。 7.应用层

相关主题