第一篇:linux c网络网络编程面试题收集
1.下列程序在32位linux或unix中的结果是什么?
func(char *str)
{
printf(“%d”,sizeof(str));
printf(“%d”,strlen(str));
}
main()
{
char a[]=“123456789”;
printf(“%d”,sizeof(a));
func(a);
}
答: 1049
网络/网络编程部份:
1、connect方法会阻塞,请问有什么方法可以避免其长时间阻塞?
答:最通 常的方法最有效的是加定时器;也可以采用非阻塞模式。
2、网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻 知道?
答:若客户端掉线或者重新启动,服务器端会收到复位信号,每一种tcp/ip得实现不一样,控制机制也不一样。
3.在子网210.27.48.21/30种有多少个可用地址?分别是什么?
答:
简:
30表示的是网络号(network number)是30位,剩下2位中11是广播(broadcast)地址,00是multicast地址,只有01和10可以作为host address。
详:
210.27.48.21/30 代表的子网的网络号是30位,即网络号是210.27.48.21 & 255.255.255.251=210.27.48.20,此子网的地址空间是2位,即可以有4个地址:210.27.48.20, 210.27.48.21, 210.27.48.22, 210.27.48.23。第一个地址的主机号(host number/id)是0,而主机号0代表的是multicast地址。最后一个地址的最后两位是11,主机号每一位都为1代表的是广播(broadcast)地址。所以只有中间两个地址可以给host使用。其实那个问题本身不准确,广播或multicast地止也是可以使用的地址,所以 回答4也应该正确,当然问的人也可能是想要你回答
2。我个人觉得最好的回答是一个广播地址,一个multicast地址,2个unicast地址。
4.TTL 是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
答:
简:TTL 是Time To Live,一般是hup count,每经过一个路由就会被减去一,如果它变成0,包会被丢掉。它的主要目的是防止包在有回路的网络上死转,浪费网络资源。ping和 traceroute用到它。
详: TTL是Time To Live,目前是hup count,当包每经过一个路由器它就会被减去一,如果它变成0,路由器就会把包丢掉。IP网络往往带有环(loop),比如子网A和子网B有两个路由器 相连,它就是一个loop。TTL的主要目的是防止包在有回路的网络上死转,因为包的TTL最终后变成0而使得此包从网上消失(此时往往路由器会送一个 ICMP包回来,traceroute就是根据这个做的)。ping会送包出去,所以里面有它,但是ping不一定非要不可它。traceroute则是 完全因为有它才能成的。ifconfig是用来配置网卡的,netstat-rn 是用来列路由表的,所以都用不着它
5.路由表示做什么用的?在linux环境中怎么来配置一条默认路由?
答:
简:路由表是用来决定如何将包从一个子网传送到 另一个子网的,换局话说就是用来决定从一个网卡接收到的包应该送的哪一张网卡上的。在Linux上可以用“route add default gw <默认路由器IP>”来配置一条默认路由。
详: 路由表是用来决定如何将包从一个子网传送到另一个子网的,换局话说就是用来决定从一个网卡接收到的包应该送的哪一张网卡上的。路由表的每一行至少有目标网 络号、netmask、到这个子网应该使用的网卡。当路由器从一个网卡接收到一个包时,它扫描路由表的每一行,用里面的netmask和包里的目标IP地 址做并逻辑运算(&)找出目标网络号,如果此网络号和这一行里的网络号相同就将这条路由保留下来做为备用路由,如果已经有备用路由了就在这两条路 由里将网络号最长的留下来,另一条丢掉,如此接着扫描下一行直到结束。如果扫描结束任没有找到任何路由,就用默认路由。确定路由后,直接将包送到对应的网 卡上去。在具体的实现中,路由表可能包含更多的信息为选路由算法的细节所用。题外话:路由算法其实效率很差,而且不scalable,解决办法是使用IP 交换机,比如MPLS。
在Linux上可以用“route add default gw <默认路由器IP>”来配置一条默认路由。
6.在网络中有两台主机A和B,并通过路由器和其他交换设备连接 起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排除故障? 答:测试这两台 机器是否连通:从一台机器ping另一台机器
如果ping不通,用traceroute可以确定是哪个路由器不能连通,然后再找问题是在交换设备/hup/cable等。
7.网络编程中设计并发服务器,使用多进程 与 多线程,请问有什么区别?
答案一:
1,进程:子进程是父进程的复制 品。子进程获得父进程数据空间、堆和栈的复制品。
2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数 据,但拥有自己的栈空间,拥有独立的执行序列。
两者都可以提高程序的并发度,提高程序运行效率和响应时间。
线程和进程在使用上各有优缺 点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
答案二:
根 本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:
1。速度: 线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。
2。资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空 间内。
3。同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内。
第二篇:C++ 面试题(服务器编程、网络编程方便)
C++ 面试题-专注于服务器编程、网络编程 C++ 面试题
1.类成员指针
Class test
{
Public:
Int fun(int)const;
Int fun(int);
Static int fun(int);
Int iTemp;
}
1.1非静态成员函数指针定义:
int(Test::*pFun)(int)= &Test::fun;
int(Test::*pFunConst)(int)const = &Test::fun;
使用:
Test a;
const Test b;
(a.*pFun)(2)或(a.*pFunConst)(2);
(b.*pFunConst)(2);
不能用(b.*pFun)(2);
1.2非静态成员变量int Test::*pInt = &Test::iTemp;
(a.*pInt)= 3;
1.3静态成员函数指针int(*pFun)()= &Test::fun;
或 int(*pFun)()= Test::fun;都正确;(注:定义无域操作符)使用:
(*pFun)()或 pFun()都正确;
2.非成员函数指针和静态成员函数一致。
3.非成员函数和静态成员函数上不允许修饰符。例如 void fun()const;void fun()volatile;但非静态 成员函数允许const、volatile等修饰符。
4.变量修饰符
auto:指定数据存储在栈中。局部变量默认为auto。该修饰符不能用于成员变量和全局变量。
static: 局部变量表示存储在静态空间,全局变量表示不允许外部引用。
volatile:表示该变量可能随时改变,不要做任何假设优化。
mutale: 去除成员变量的const属性。
extern:全局变量默认为extern属性,表示可被外部引用,此时与static相对。
extern int a =2;表示定义一个可被外部引用的变量。
extern int a;表示引用外部变量。
5.数据类型隐式转换
短数据->长数据(eg: float-> double)
有符号->无符号(eg: int-> unsigned int)PS: 所以 int(-1)>unsigned int(1);
低精度->高精度(eg: int-> float)
6.memcpy 有“防重叠”覆盖机制,strcpy 没有。
7.float表示
共计32位,折合4字节
由最高到最低位分别是第31、30、29、……、0位
31位是 符号位,1表示该数为负,0反之。
30-23位,一共8位是指数位。
22-0位,一共23位是尾数位。
每 8位分为一组,分成4组,分别是A组、B组、C组、D组。
每一组是一个字节,在内存中逆序存储,即:DCBA
8.不能在类的声明中初始化类常量,而只能在构造函数初始化列表来初始化
9.类中的枚举常量不占用对象的存储空间
10.有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。
11.赋值函数,应当用“引用传递”的方式返回String 对象。如果用“值传递”的方式,虽然功能仍然正确,但由于return 语句要把 *this 拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,降低了赋值函数的效率。
12.对于非内部数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。如果用free 释放“new 创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete 释放“malloc 申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。
13.如果用new 创建对象数组,那么只能使用对象的无参数构造函数,delete时如果对象没有析构函数,则delete和delete[]是功能相同的。
14.只能靠参数而不能靠返回值类型的不同来区分重载函数。编译器根据参数为每个重载函数产生不同的内部标识符。并不是两个函数的名字相同就能构成重载。全局函 数和类的成员函数同名不算重载,因为函数的作用域不同。
15.关键字inline
必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。定义在类声明之中的成员函数将自动地成为内联函数。
以下情况不宜使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体 内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
16.只有静态常量整型数据成员才可以在类中初始化,普通成员只能在初始化列表或函数内初始化,常量成员只能在初始化列表。成员对象初始化的次序完全不受它们在 初始化表中次序的影响,只由成员对象在类中声明的次序决定。
17.拷贝构造函数和赋值函数非常容易混淆,常导致错写、错用。拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用。
18.不想编写拷贝构造函数和赋值函数,又不允许别人使用编译器生成的,则只需将拷贝构造函数和赋值函数声明为私有函数,不用编写代码。
19.“const T”和“T const”总是都被允许的,而且是等效的。
注意在常量指针(const pointer)中,“const”永远出现在“*”之后。
例如:
int *const p1 = q;//指向int 变量的常量指针
int const* p2 = q;//指向int 常量的指针
const int* p3 = q;//指向int 常量的指针
20.一个常见的微妙问题是,一个函数风格的宏并不遵守函数参数传递的规则。
21.没有引用数组,但可有指向数组的引用,并且保留数组的边界。
22.左值拥有保存值的位置,而右值则没有相关地址,只是简单值。
23.负索引是可以的,如p[-2]或(-2)[p]都是可以的(p必然不能是数组名),但必须保持不越界。
sum=p()+q()+r();不能保证p(),q(),r()调用的顺序。
逗号运算符“,”可以保证求值顺序.result=(p(),q(),r());是先求p(),q(),然后将r()赋给result
24.在if的条件里声明变量,且可在真假分支里面使用。
const int * const * p;p是个指针,指向常指针的,常指针指向一个常量int。
25.不能用空白初始化列表来规定默认的对象初始化.class a;
a A();//会警告,看起来像函数声明
a *p=new a();//ok
a *p=new a;//ok
26.可以写一句只有数字的代码,如1234;(void)0;可以编译执行,相当于nop。
27.给函数指针赋值时可以对函数名取地址也可以不取,通过函数指针调用函数时可以用*也可不用。
28.static_cast可以转换基本数据类型(int->char)、void*和有类型指针、基类和派生类指针的转换(多重继承也行,它可重新计算偏移地址),但是不能转换如(int*->char*等)。
29.dynamic_cast主要用于执行“安全的向下转型”,reinterpret_cast可执行任何转换,const_cast执行去 const转换。
30.将取地址运算符用到完全限定的类成员名(包括变量和函数),就能获得指向成员的地址。使用形式为“X::*”来声明一个指向类X成员的指针。注意声明成员 函数指针的时候不能像普通函数指针可以省略&或*的使用,但静态成员函数则除外,它和普通函数一致。成员指针和普通指针不一样,并非指向一个内存 区域,而是相当于一个结构的偏移量,当它和具体的对象结合就能指向特定对象的特定成员。
31.当把派生类对象赋给基类对象的时候会产生切割现象,即针对派生类的数据和行为将产生切割。
32.多维数组的第1个元素是数组而非普通类型。
33.在含有单参数构造函数的类中注意隐式转换。如String s=“Hello”;
34.函数对象是重载函数调用运算符的类对象。
35.引用需要用左值进行初始化,但指向常量的引用除外,编译器将创建一个临时左值。如const int c=12;//ok 一般情况下编译器产生的临时对象的生命期在它所在的最大表达式范围内,但用临时对象初始化常量对象的引用时会让编译器保证临时对象和引用生命周期一样。
36.可以将基类的成员指针(变量或函数)安全的转换为指向派生类成员的指针,但反之则不安全。
37.函数参数的传递是采用拷贝构造函数而非赋值操作。对未初始化的对象赋值可能会出现意外,如类中含有未初始化指针。
38.声明但不定义私有的拷贝构造和赋值运算将会关闭类的复制操作。并且赋值运算、拷贝构造函数和析构函数不会被继承,对派生类重载赋值运算时需要调用基类的赋 值运算。
39.在构造函数里对成员变量初始化,比较好的方式是使用初始化列表。在初始化列表中静态成员和数组不能被初始化。
类的初始化顺序是虚拟基类的成员->非虚基类成员->类自身成员,和初始化列表的顺序无关。含有虚拟基类和不含的类在成员布局上不一样,含有虚拟基类的类将虚拟基类的数据放在最后面。另外如B:virtual A,C:virtual A,D:B,C;(均是虚继承)则D的构造函数将对A初始化一次(即使在初始化列表没有显式初始化A),B,C将不再对A初始化。
所有静态数据(全局变量和静态存储变量)在使用前如未初始化其值都为0.全局变量可以存储在静态初始化区和未初始化区。
40.RVO返回值优化,是指在函数返回中执行拷贝初始化到直接初始化(使用带非对象参数的构造函数)的转换,NRV和RVO类似,但使用命名局部变量来保存返 回值。p160
41.重载、覆盖和隐藏的区别
重载的特征:在同一个类,函数名相同,参数不同,virtual可有可无。
覆盖的特征:在两个类(基类和派生类),函数名和参数都相同,且必须有virtual关键字。
隐藏的特征:基类函数名和派生类函数名相同参数不同,且不管是否有关键字。或函数名、参数均相同,但基类 函数没有virtual(有的话就是覆盖)。
不能覆盖而只能隐藏基类非虚函数。
42.相同类型的所有对象公用一个虚函数表,在单继承下不管有多少个虚函数都只有一个虚函数表指针。覆盖就是在为派生类构造虚函数表时用派生类的函数地址替换基 类成员函数地址的过程。
43.使用常量类成员可能在对类对象赋值的时候产生问题。
44.有时候我们可能会看到 if(NULL == p)这样古怪的格式。不是程序写错了,是程序员为了防止将 if(p == NULL)误写成 if(p = NULL),而有意把p 和NULL 颠倒。
第三篇:网络编程实验报告
实验一 TCP Socket API程序设计
一、预备知识
1.网络编程基本概念
网络上的计算机间的通讯,实质上是网络中不同主机上的程序之间的通讯。在互联网中使用IP地址来标识不同的主机,在网络协议中使用端口号来标识主机上不同进程,即使用(IP地址,端口号)二元组。
套接字(Socket)用于描述IP地址和端口,是一个通信链的句柄,通信时一个网络程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡相连的传输介质将这段信息发送到另一台主机的Socket中,以供其他程序使用。
图1-1 TCP通信流程 2.TCP通信流程
TCP程序是面向连接的,程序运行后,服务器一直处于监听状态,客户端与服务器通信之前必须首先发起连接请求,由服务器接收请求并在双方之间建立连接后才可以互相通信。
二、实验目的
1.了解Winsock API编程原理; 2.掌握TCP Socket程序的编写; 3.了解C/S模式的特点; 4.学会解决实验中遇到的问题。
三、实验任务
使用Winsock API相关类实现TCP Socket通信程序,并能成功运行。
四、实验环境及工具
1.Windows2000/XP/7 2.Visual C++开发平台 3.Visual Studio2010
五、实验内容和步骤
参照《Visual C++网络编程教程》书中81页,TCP Socket API程序设计。连接:
void CChatClientDlg::OnConnect(){
WSADATA wsd;
//WSADATA结构
WSAStartup(MAKEWORD(2,2),&wsd);
//加载协议,使用Winsock 2.2版
m_client = socket(AF_INET,SOCK_STREAM,0);//创建流式套接字
//服务器地址
sockaddr_in serveraddr;
UpdateData();
if(ServerIP.IsBlank())
{
AfxMessageBox(“请指定服务器IP!”);
return;
}
if(sPort.IsEmpty())
{
AfxMessageBox(“请指定端口!”);
return;
}
//获取服务器进程的IP和端口
BYTE nFild[4];
CString sIP;
ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);
sIP.Format(“%d.%d.%d.%d”,nFild[0],nFild[1],nFild[2],nFild[3]);
//设置服务器地址结构的内容
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);
serveraddr.sin_port = htons(atoi(sPort));
//发起连接须指明要访问的服务器进程地址,这个地址存储在serveraddr中
if(connect(m_client,(sockaddr*)&serveraddr,sizeof(serveraddr))!= 0)
{
MessageBox(“连接失败”);
return;
}
else
{
m_ListWords.AddString(“连接服务器成功!”);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
ServerIP.EnableWindow();
ServerPort.EnableWindow();
m_ButtonConnect.EnableWindow();
m_ButtonDisconnect.EnableWindow(false);
m_EditWords.EnableWindow(false);
m_ButtonSend.EnableWindow(false);
m_ButtonExit.EnableWindow();}
“发送”按钮事件过程代码如下:
void CChatClientDlg::OnSend(){
//向服务器发送信息
UpdateData();
if(m_sWords.IsEmpty())
{
AfxMessageBox(“发送的消息不能为空!”);
return;
}
//开始发送数据
int i = send(m_client,m_sWords.GetBuffer(0),m_sWords.GetLength(),0);
m_ListWords.AddString(“发送:” + m_sWords);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
closesocket(m_client);
ServerIP.EnableWindow();
ServerPort.EnableWindow();
m_ButtonConnect.EnableWindow();
m_ButtonDisconnect.EnableWindow(false);
m_EditWords.EnableWindow(false);
m_ButtonSend.EnableWindow(false);
m_ButtonExit.EnableWindow();} “清空”按钮的事件过程: m_ListWords.ResetContent();“关于”按钮的事件过程: CAboutDlg dlgAbout;dlgAbout.DoModal();
服务器端: 开始监听代码:
void CChatServerDlg::OnListen(){
WSADATA wsd;
//WSADATA结构
WSAStartup(MAKEWORD(2,2),&wsd);
//加载协议栈,使用Winsock 2.2版
m_server = socket(AF_INET,SOCK_STREAM,0);//创建流式套接字
//将网络中的事件关联到窗口的消息函数中,定义消息号为20000,侦测客户端的连接请求
WSAAsyncSelect(m_server,m_hWnd,20000,FD_ACCEPT);
m_client = 0;
BYTE nFild[4];
CString sIP;
UpdateData();
if(ServerIP.IsBlank())
{
AfxMessageBox(“请设置IP地址!”);
return;
}
if(sPort.IsEmpty())
{
AfxMessageBox(“请设置监听端口!”);
return;
}
ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);
sIP.Format(“%d.%d.%d.%d”,nFild[0],nFild[1],nFild[2],nFild[3]);
//服务器地址
sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);
serveraddr.sin_port = htons(atoi(sPort));
//绑定地址
if(bind(m_server,(sockaddr*)&serveraddr,sizeof(serveraddr)))
{
MessageBox(“绑定地址失败.”);
return;
}
//监听开始,服务器等待连接请求的到来
listen(m_server,5);
m_ListWords.AddString(“监听开始:”);
m_ListWords.AddString(“地址” + sIP + “ 端口” + sPort);
m_ListWords.AddString(“等待客户端连接„„”);
//界面完善
m_ListWords.SetTopIndex(m_ListWords.GetCount()-1);
ServerIP.EnableWindow(false);
ServerPort.EnableWindow(false);
m_ButtonListen.EnableWindow(false);
m_ButtonStopListen.EnableWindow();
m_ButtonClear.EnableWindow();
m_ButtonExit.EnableWindow(false);} “停止监听”按钮事件过程代码如下: void CChatServerDlg::OnStopListen(){
//停止监听
closesocket(m_server);
m_ListWords.AddString(“停止监听”);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);} “断开”按钮事件过程代码如下: void CChatServerDlg::OnDisconnect(){
closesocket(m_client);
m_ListWords.AddString(“与客户端断开”);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
//界面完善
m_ButtonDisconnect.EnableWindow();
m_EditWords.EnableWindow();
m_ButtonSend.EnableWindow();} ReceiveData()函数代码如下:
void CChatServerDlg::ReceiveData(){
//接收客户端的数据
char buffer[1024];
int num = recv(m_client,buffer,1024,0);
buffer[num] = 0;
CString sTemp;
sTemp.Format(“收到:%s”,buffer);
m_ListWords.AddString(sTemp);//显示信息
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
closesocket(m_client);//关闭与客户端通信的Socket
WSAAsyncSelect(m_server,m_hWnd,20000,FD_ACCEPT);//准备接收新的客户端连接
//界面完善
m_ButtonDisconnect.EnableWindow(false);
m_EditWords.EnableWindow(false);
m_ButtonSend.EnableWindow(false);} 服务器的初始化代码如下: //界面初始化
m_ButtonStopListen.EnableWindow(false);m_ButtonDisconnect.EnableWindow(false);m_ButtonClear.EnableWindow(false);m_EditWords.EnableWindow(false);m_ButtonSend.EnableWindow(false);
运行结果:
六、思考题
1.用Winsock API编程时,主要进行哪些通行的操作步骤? 2.阐述C/S模式的通信过程。答:
1.通行的操作
1.Winsock的打开(WSAStartup())。2.建立套接字(socket()或WSASocket())。3.地址绑定(bind())。
4.服务器监听连接(listen())。
5.客户端提出连接申请(connect()或WSAConnect())。6.服务器接收客户端的连接请求(accept()或WSAAccept())。7.数据的发送(send()或WSASend(),sendto()或WSASendTo())。8.数据的接收(recv()或WSARecv(),recvfrom()或WSARecvfrom())。9.关闭套接字(closesocket())。10.关闭Winsock(WSACleanup())。
2通信过程
第四篇:网络工程师面试题
上海技术面试题总结
(一) OSI七层模型?
答: 物理层:主要负责比特流的传输
数据链路层:链路连接的建立,拆除,分离。将数据封装成帧。差错检测和恢复 网络层:路由选择和中继
差错检测
流量控制 传输层:传输层提供了主机应用程序进程之间的端到端的服务
分割与重组数据、按端口号寻址、连接管理、差错控制和流量控制
会话层:允许不同机器上的用户之间建立会话关系,如WINDOWS 表示层:数据的表现形式,特定功能的实现,如数据加密。应用层:用户接口,提供用户程序“接口”。 TCP/IP每层所使用的协议?
答:1)链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机
中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。2)网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路。在 T C P / I P协议族中,网络层协议包括I P协议(网际协议),I C M P协议(I n t e r n e t互联网控 制报文协议),以及I G M P协议(I n t e r n e t组管理协议)。)运输层主要为两台主机上的应用程序提供端到端的通信。在 T C P / I P协议族中,有两个 互不相同的传输协议:T C P(传输控制协议)和U D P(用户数据报协议)。
T C P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分 成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟 等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面,U D P则为应用层提供一种非常简单的服务。它只是把称作数据报的分组 从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠 性必须由应用层来提供。
这两种运输层协议分别在不同的应用程序中有不同的用途,这一点将在后面看到。)应用层负责处理特定的应用程序细节。几乎各种不同的 T C P / I P实现都会提供下面这些 通用的应用程序:
Telnet 远程登录。FTP 文件传输协议。SMTP 简单邮件传送协议。SNMP 简单网络管理协议
数据链路层:ARP,RARP;网络层: IP,ICMP,IGMP;传输层:TCP ,UDP,UGP;应用层:Telnet,FTP,SMTP,SNMP.1.怎么样检测TCP/IP正常运行 运行cmd,然后输入ping 127.0.0.1
2.写出568A.568B的线序
568A:绿白、绿、橙白、蓝、蓝白、橙、棕白、棕 568B:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕 直通线一般都用A线序或B线序 交叉线一端是568A 一端 是568B
3.如果用户的机器经常出现蓝屏的情况应该怎么办
首先考虑软件兼容性问题。可以将软件备份到其他计算机。然后删除软件。如果还不能解决就有可能是硬件兼容问题。先拔出不必要外设,比如打印机、扫描仪等等。再不行就是及其内部硬件兼容问题了。如果不是软件不是外设引起的蓝屏那么大部分都是由内存引起的。可以拔下内存擦一下金手指。或者更换其他内存条看看
4.NAT(网络地址转换)有三种类型,静态转换,动态转换,端口复用(PAT)。其中端口复用最为常用,一般配置在公司的接入路由器上。静态转换多于端口映射,用来将内部的服务器发布出来
5.VLAN的作用
虚拟局域网。主要划分广播域用。交换机所有端口都处于相同广播域。这样随着级联交换机增多那么广播域内主机数也增多。广播流量也随之增加。为了有效控制广播数量可以考虑用vlan来划分广播域。增加网络安全性
6.内网有60台电脑(其中还有服务器),只有5个公网ip,怎么做让内网电脑上网
第一:采用动态地址转换,由五个公网地址构成一个地址池,内网主机采用地址池中的地址上公网,但同时只能有五台主机能上公网。第二:采用端口地址转换(PAT),创建五个地址池,每个地址池只有一个公网IP地址,将60台主机按照管理策略分成五组,分别对应一个地址池.第三:采用端口地址转换,全部60台主机转换成一个公网IP地址,其它四个公网地址留做它用.(也可以用5个公网IP)
7.某用户不能和LAN通信
检查物理连接。网卡灯是否正常。速率和双工和交换机是还匹配。2.检查MAC地址是否与其它主机冲突。3.检查是否接入到了同一个VLAN里。4.检查IP地址是否与其它主机冲突。
8.用户可以访问LAN 可不能上网,为什么 1。检查能否PING通网关。
2.检查DNS服务器地址设置是否正确。3.使用NSLOOKUP进行域名解析。
4.杀毒。如网络中有ARP病毒。5。检查防火墙设置,再检查用户权限
9.C类地址有多少ip地址 B类地址有多少ip地址 C类256个IP地址(254个主机地址)B类65536个IP地址(65534个主机地址)10.常用端口号 20:ftp传输数据 21:ftp 建立连接 23:telnet,远程管理 25:smtp,邮件收发 53:DNS,域名解析 80:http,网页服务
110:pop,邮局协议,主要用于接收邮件
MAC地址有几位,工作在哪一层?
答:由42个二进制数字组成,一般用12个十六进制数字来写,前六位是固定的厂商ID,后6位就代表地址;工作在数据链路层
列举常见的路口扫描等安全产品
答:端口扫描软件Xscan、superscan、流光 Windows管理员存在那个文件?
答:sam文件在 Windowssystem32config下 Windows的安全进程?
答:100Process: winlogon.exe [windows nt用户登陆程序。]安全C:WINDOWSsystem32services.exe 100Process: lsass.exe [本地安全权限服务控制windows安全机制。]安全C:WINDOWSExplorer.EXE 算子网划分 答:举个例子:
172.16.18.5/19 它的子网掩码的算法
172.16.18.5本来是B类地址,它的子网掩码是255.255.0.0,也就是16位,但是现在是19位,那就是网络位向主机位借了3位,那么16位的子网掩码转换为二进制是:11111111.11111111.00000000.00000000;19位的子网掩码转换为二进制是:11111111.11111111.11100000.00000000;再转换为16进制是:255.255.224.0;
IP地址和子网掩码做“与”运算:
172.16.18.5 : 10101100.10000000.1001000.10100000 255.255.224.0:11111111.11111111.11100000.00000000 网络号: 10101100.10000000.10000000.00000000 转换为十进制是:172.16.16.0 交换机、路由器、集线器等设备工作在那一层? 答:交换机工作在数据链路层 路由器工作在网络层
集线器工作在物理层
1、OSI参考模型分为7层
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
1、在 windons server 2003 下若选择安全登录,则需要按(Ctrl+Alt+Del)组合键
2、按网络的覆盖范围划分,网络可分为【局域网(LAN)、城域网(MAN)、广域网(WAN)】
3、计算机中的数据都是以【二进制码】形式发送的
4、ARP请求帧在物理网络中是以【广播】方式发送 1.1 [简单说一下OSI七层]
Osi模型是一个工业的标准.它为现在的互联网提供了很大的贡献。是一个逻辑上的规范和标准,很多厂商都要遵循它。他定义了七层每一层都有不同的功能和规范。
--物理层
物理层定义了设备接口上的一些电子电气化的标准,比如RJ45接口,光纤接口。传输介质双绞线,无线,光,电。等
--数据链路层
二层定义了一个重要的表示,MAC地址,准确的说他必须在一个LAN内是唯一的。他又48位的十六进制组成,前24位是厂商表示,后24位 是厂商自定义的序列号。有时候 MAC地址就是表示了一个设备的位置。
--网络层
网络层是用来逻辑上选路寻址的,这一层最重要的一个协议就是IP协议。基于ip 又分为 ARP,RARP,ICMP,IGMP等
--传输层
这一层定义类了 两个重要的协议 TCP和UDP。还有就是端口号的概念。这一层关联的是一个主机上的某个程序或者是服务。比如 tcp 80 的web服务 udp 4000的QQ 程序等。
--会话层
主要作用是建立会话和管理会话。我一般这样理解 会话的 比如 telnet 一台主机,是一次会话的链接。打开百度的网页,就和百度的服务器建立了一次会话。
--表示层
因为底层传输的是二进制,应用层无法直接识别。所以根据这一层的名字可以直接理解为他是一个翻译。比如把一长串的数据“翻译”成rmvb格式,交给上层的 快播 这个程序,把另一串数据“翻译成”MP3格式交给 音乐播放器。其实这一层的工作很多。
压缩,解压缩,加密,解密等
--应用层
为用户提供了一个可以操所的界面,如windows的桌面化或UNIX的字符界面。
OSI七层的每一层是独立工作的,但是层与层之间是相互“合作”“兼容”的关系。1.2 [三层交换和路由器的不同]
虽说三层交换机和路由器都可以工作在三层,但本质上还是有所区别。
一 在设计的功能上不同
现在有很多的多功能路由器,又能实现三层的路由功能,包括NAT地址转换。有提供了二层的端口,有的还配置了无线功能。再有就是还具备防火墙的功能。但是你不能它单独的划分为交换机或者是防火墙吧。只能说是个多功能的路由器。防火墙二层交换只是他的附加功能。三层交换也一样,主要功能还是解决局域网内数据频繁的通信,三层功能也有,但不见得和路由器差很多。
二 应用的环境不同
三层交换的路由功能比较简单,因为更多的把他应用到局域网内部的通信上,主要功能还是数据的交换
路由器的主要功能就是选路寻址,更适合于不同网络之间,比如局域网和广域网之间,或者是不同的协议之间。
三 实现方式不同
路由器能够实现三层的路由(或转发)是基于软件的实现方式,当收到一个数据包要转发的时候,要经过查看路由表,最长匹配原则等一系列复杂的过程最终实现数据包的转发,相比三层交换效率略低。而三层交换是基于硬件的方式实现三层的功能,他成功转发一个数据包后,就会记录相应的IP和MAC的对应关系,当数据再次转发是根据之前的记录的表项直接转发。这个过程成为“一次路由,多次交换”。
总之,三层交换和路由器的最大区别是路由器可以基于端口做NAT,而三层交换机不能。路由器直接接入光纤可以直接上网,而三层交换机不能。主要是三层交换机的每一个接口都有专有的MAC地址和特定的ASIC集成电路。
.1.3 [静态路由和动态路由的区别]
静态路由特点
静态路由是管理员手工配置,精确。但是不够灵活,是单向性的。考虑到静态路由稳定,节省资源(内存,cpu,链路带宽)。在网络TOP不是很大的环境中常用。
动态路由的特点
动态路由的好处就是路由器本身通过运行动态路由协议来互相学习路由条目,在大型的网络环境中,一定程度上减少了工程师的工作量。动态路由协议分为很多种,IGP和EGP,IGP中根据工作的原理分为链路状态型和距离矢量型的。但是不管哪一种动态协议,他都要经过以下几个过程。
1.“说话” 向其他的路由器发送路由信息
2.“收听” 接收其他路由器发来的路由信息
3.“计算”不同的动态路由协议有不同的算法,每种路由协议通过自己特有的算法把收到的路由信息计算,得出最好的路由条目,加载到路由表中。
4.“维护” 维护路由表,当TOP发生变化的时候,及时的更新自己的路由表,并发送变更的消息
在生产环境下,应当更具不同的网络规模,选择不同的路由协议。的
第五篇:网络编程实习作业
网络编程实习作业
一. 实习内容:
了解插口(socket)实现原理。
在某一种平台(Linux,Unix系列或Windows系列)下进行网络客户机-服务器编程。
二. 主要参考书目:
W.Richard Stevens, “UNIX Network Programming Networking APIs: Scokets and XTI(Volume 1,Second Edition)”,清华大学出版社 Prentice-Hall International, Inc.或其中文版 “UNIX网络编程(第1卷,第2版)” 经典读物,目前的最新版是第三版
Douglas Comer,《用TCP/IP进行网际互连 第3卷:客户机-服务器编程和应用(第2版)》 或其英文版 Internetworking With TCP/IP Vol III: Client-Server Programming And Application(Second Edition)以下简称《客户机-服务器编程》
三. 实习题目:
1:编写DAYTIME服务的UDP客户机和服务器的实现。
基本要求:
当服务器端收到客户端的请求后,将当前daytime返回给客户端,客户端收到该回应后,将收到的daytime显示到输出中。
(其中在Linux或Unix环境中,当前daytime的获得参考函数time()和ctime())
2:熟悉Http协议的请求和响应格式,编写一个简单的Http服务器。题目描述参考《自上而下计算机网络》(第三版 作者James F.Kurose)第二章课后编程作业1。
基本要求:正确解析Http请求,实现简单的GET请求回应。模拟一个对象(如:文件index.html)的GET回应(如:回应一个字符串),对于其他的对象,则根据Http响应格式回应对象不存在信息。3 通过浏览器可检测自己的程序。如:输入,查看其响应结果。对http请求的处理必须采用多进程实现,即主进程负责等待请求连接,每当收到一个请求后,产生一个子进程对该请求做单独处理,主进程继续等待新请求,子进程在处理完其请求后结束自己。详细要求参考课本要求。(多进程编程参考函数fork())
要求:
源程序部分带有必要的注释,备有一份文档说明各个程序中的思路和关键技术。注意,只能使用C语言编写。可以是windows或者linux下可执行,二种环境选择一种即可。
评分标准
90% 以上 :在程序说明文档中,可以体现出自己对本程序所用到的技术有较深刻的理解。
程序有较好的可读性(关键部分的注释比较详细)。
80% :符合要求,程序说明的比较详细,思路比较清楚。
70% :只有程序没有说明文档的,70%-60% :缺少说明文档
60% 以下 :程序或说明文档完全和别人的一样(抄袭于被抄袭者一样处理)。
注:作业包括程序部分(.c,.cpp,.h等源码和.exe等可执行文件,不要.obj 等其他文件)和程序说明文档,文件大小最好不要超过1M。程序说明要体现出你所用到的关键技术,要说清楚自己定义函数的功能及实现,要有关键部分的流程图。要按时交作业,晚交的要相应的扣分。请将程序打成一个包,包名统一采用“学号_姓名”形式,然后发到
network_tju@163.com
邮件的Title也是“学号_姓名”
请一定将学号放在前面
5截至日期:2009年4月20日
(注:1.以邮箱接收到的时间戳为准。2.在提交作业时,请最好选择发送并保存邮件,避免由于投递失败而导致作业无法按时完成。(就是避免死无对证)3.杜绝抄袭,请尽早开始着手这项作业)