大二网络工程专业期末知识整理
常用网络命令
ping命令(看不到自己IP地址)
Ping -f 在数据包中设置不分段(如果大于MTU会报错)
Ping -i 生存时间
Ping -4使用IPv4
Ping -a将地址解析到主机名称
tracert命令(看不到自己IP地址)
arp命令(看得到IP地址)
- arp -a 显示所有缓存表
- arp -d 删除某个缓存表
- arp -s 添加某个静态缓存(不会超时)
接口:当前IP地址
Route命令(能看到本机IP地址)
打印路由表 route print
增添路由表 route add
删除路由表 route delete
Netstat命令(可以看到本机IP地址)
Netstat -a 显示所有连接和侦听端口
Netstat -n 显示地址和端口号
Netstat -o 显示每个连接关联的pid
ARP协议(地址解析/不能跨网段传输):
工作过程:先进行广播,请求的主机将MAC地址返回利用RARP返回给源主机,源主机将IP地址和MAC地址填入到缓存表中。
ARP缓存表(超时机制):一旦超时全部清空
ARP报文格式
硬件类型:2字节,一般来说为以太网(其他有BlueTooth,zigbee等)
协议类型:上层协议的类型,一般为IPv4(0x0800)
硬件地址长度:6位(MAC)
协议地址长度:4位(IPv4)
Opcode:操作码,规定是ARP(1)还是RARP(2)
其余就是各种地址(MAC和IP地址)
IP协议(将不同网段连接起来):
几种特殊的IP地址
- 全是255的地址:广播地址
- 全0地址:在网络中的我自己(192.168.0.1进入外网)
- 127.0.0.1:本地回环地址(不进入外网,CPU的IP地址)
IP报文长度:20-60字节
VER:版本号: IPv4/IPv6
IHL:报头长度
ServiceType:3比特的优先权。从0-7
4-1位表示服务类型参数:
DTRC:D低延迟,T高吞吐,R高可靠,C成本(只能有一个为1)
Total Length:数据报总长度 65535个字节
Identification(16bits):用于标识第几个分片,能标识65535个数据分片
Flags(3bits):分割控制标志
第一位为0位,最高预留位,第二位DF不可分割,第三位MF标志位置,如果为1说明还有数据报,如果是0则说明这是最后一个
Fragment Offset:分割偏移量,单位为8字节,第一个偏移是0
TTL(8bit):(MAX 255)存活时间,如果为0则直接被丢弃
Protocol(协议):标识上一层的协议是什么(6 TCP)
Head Checksum:报头校验和,检验差错
SA:源地址 DA:目的地址
IP选项:
EOL:结束标志 NOP:无操作
RR:记录经过的所有路由
-> SSRR:严格源路由,严格按照设定的路由
-> LSRR:宽松源路由,可以不按照设定的路由
TS:时间戳计算(只能给出大致参考值)
MTU:最大报文长度
分片原则:不能超过最大MTU,片大小必定是8的整数倍
分片变化:id,offset,flag,total length,checksum都会发生变化
IPv6:更安全 报头简化 报头固定方便CPU处理
ICMP协议:
不产生ICMP错误的情况
(1)ICMP差错数据包 (2)目的地址为广播
(3)链路层广播数据包(ARP) (4)非IP分片的第一片
(5)源地址不是个单播地址
TCP协议:三次握手四次挥手
注意区分哪个是服务器和客户端
FTP协议(文件传输协议):
常用命令: 参数传输命令:
USER 提供用户名 PORT 主动模式传输数据
PASS 提供密码 PASV 被动模式传输数据
CWD 改变工作目录
QUIT 退出,关闭控制连接
服务命令:
PWD 显示工作目录 STOR 上传文件
MKD 新建工作目录 RETR 下载文件
RMD 删除指定目录 LIST 显示内容
NOOP 不操作(保持连接)
FTP应答:(注意和HTTP相反)
1yz 肯定预备应答
2yz 标识命令执行成功
3yz 表示命令被接受
4yz表示命令执行出错(服务器出错)
5yz 表示命令无法被接受(客户端出错)
PORT:主动开放20端口传输数据
PASV:随机开放一个端口传输数据
HTTP协议(超文本传输协议):
两种常用方法:GET(请求数据) POST(上传数据)
HTTP响应消息格式:
1xx 保留
2xx 表示请求成功
3xx 为完成请求客户需要进一步细化需求
4xx 客户错误
5xx 服务器错误
常用:
200 OK 403 服务器拒绝提供服务
401 请求未授权 404 请求资源不存在
503 网络拥塞 500 服务器故障
报头详解:
1.通用头
Cache-Control:
(1)no-cache 读cache时会被清空
(2)no-store 没有缓存(不能缓存)
(3)Public 指示响应可以被任何缓存区缓存
(4)Private 对单个用户缓存
Date:发送消息的时间
Connection:指定close 响应后就关闭/Keep-alive 保持连接
- 请求头
- Accept 表示客户端希望接受的资源
- Accept-Charset 用户接受的字符集(字符编码)
- Accept-Encoding 用户接受的文件编码
- Accept-Language 接受的自然语言
- Host 客户端指定自己想访问的域名/IP地址和端口号
- User-Agent 允许客户端告诉服务器自己的操作系统
- 响应头
- Location 重定向到新的位置
- Server 服务器软件信息
- WWW-Authenticate 401报文中响应消息(验证机制)
- 实体头
- Content-Encoding 文档的编码方式
- Content-Type 发送/接受的MIME类型
如:text/html charset等
- Content-Length 内容长度
- Content-Language 内容的语言类型
(具体参考作业)
网络编程考试重点:
• Socket
– 构造、绑定、监听、连接、接受连接、数据发送/接收、关闭
• TcpClient/TcpListener
– 构造、启动、连接、接受连接、数据发送/接收、关闭
几个重要的类:
IPAddress 提供IP地址
IPEndPoint 以IP地址和端口号代表网络终端
IPHostEntry 为Internet主机地址信息提供容器类
DNS 提供域名解析功能
构造:
IPAddress ipa = IPAddress.Parse(“127.0.0.1”);
IPEndPoint ipep = new IPEndPoint(ipa,8080);
辅助方法
Encoding.ASCII.GetBytes() //将字符串转成字节
Encoding.ASCII.GetString() //将字节转成字符串
线程相关API
Thread t1 = new Thread(new ThreadStart(Thread1));
Thread1为编写好的方法名
t1.Start()//开始线程
T1.Abort()//关闭线程
Socket部分
Socket构造:
Socket socket = new Socket(AddressFamily,SocketType,ProtocolType);
AddressFamily.InterNetwork:该地址对应的协议
Sample:
Socket test_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//Stream一定对TCP
Socket 监听:
Socket.Listen(int num);num表示服务器最大接受的连接数
Socket接受:(接受客户端发来的请求)
socket.Accept();
Socket请求连接:
Socket.Connect(IPEndPoint ipep);
Socket发送和接受:
Socket.Sent(byte []data,int setoff,int size);
Socket.Receive(byte []data,int setoff,int size);
Socket绑定终端号:
Socket.Bind(IPEndPoint);
Sample:
test_socket.Bind(ipep);
Socket关闭:
Socket.Close();
服务器Socket | Bind(IPEndPoint); Listen(int num); Accept(); |
客户端Socket | Connect(IPEndPoint); |
公共Socket | Receive(byte[],int setoff,int size) Send(byte[],int setoff,int size); Close(); |
TCPClient和TCPListener:
- TCPClient
TcpClient构造:
TcpClient tc = new TcpClient(String,int32 port);
TcpClient tc = new TcpClient(IPEndPoint);
TcpClient.Close()关闭
TcpClient.Close()释放TcpClient实例
TcpClient获得流实例:
TcpClient.GetStream();获得NetworkStream实例
TCPClient连接:
TcpClient.Connect(IPAddress,port);
TcpClient.Connect(IPEndPoint);
- TcpListener
TcpListener构造:
TcpListener tl = new TcpListener(port);
TcpListener tl = new TcpListener(IPEndPoint);
TcpListener tl = new TcpListener(IPAddress,port);
TcpListener监听:
tl.Start();//开始监听
TcpListener接受请求
TcpClient m_client = m_Listener.AcceptTcpClient();
关闭用
TcpListener.Stop();
通过返回的TcpClient或者Socket来进行数据的传输
数据传输
NetworkStream ns = tcpClient.GetStream();
(用GetStream方法构建Reader,NetworkStream作为输入输出)
StreamReader sr = new StreamReader(tcpClient.GetStream())
输出:ws.Write(data,0,data.Length);(记得ws.Flush())
读入:m_returnData = rs.ReadLine();
Socket课本实例
private IPAddress myIP=IPAddress.Parse("127.0.0.1");
private IPEndPoint MyServer;
private Socket sock;
private bool check=true;
private Socket accSock;
(3)“开始监听”按钮的Click事件的代码。
private void button1_click(object sender, System.EventArgs e) {
try {
myIP =IPAddress.Parse(textBox1.2ext);
}
catch{MessageBox.Show("您输入的IP地址格式不正确,请重新输入1");} try
{
Thread thread=new Thread(new ThreadStart(accp)): thread.Start();
)
catch(Exception ee) (text Box3.AppendText (ee.Message);} }
(4)线程同步方法accp的代码。
Private void accp()
{
MyServer=new IPEndPoint (myIP, Int 32.Parse(textBox2,Text)); sock =new Socket (AddressFamily.InterNetwork,
SocketType.Stream,ProtocolType.Tcp); sock.Bind(MyServer);
sock.Listen(50);
text Box3. AppendText ("主机"+textBox1.Text+"端口"+textBox2.Text+"开始监听......\r\n");
accSock=sock.Accept();
if(accSock.Connected)
{
textBox3.AppendText("与客户建立连接。”);
while(check)
{
Byte[] Rec=new Byte[64];
NetworkStream netStream=new NetworkStream(accsock); netStream. Read (Rec, 0,Rec.Length);
string RecMessage=System.Text.Encoding.BigEndianUnicode.GetString(Rec); richTextBox1.AppendText (RecMessage+"\r\n");
}
}
(5)“发送信息”按钮Click 事件代码。
private void button2_click(object sender, System.EventArgs e) {
try {
Byte[]
sendByte=new Byte[64];
string send=richTextBox2.Text+"\r\n";
NetworkStream netStream=new NetworkStream(accsock); sendByte=System.Text.Encoding.BigEndianUnicode.GetBytes (send.ToCharArray());
netStream,Write(sendByte,0,sendByte.Length); }
catch(MessageBox.Show("连接尚未建立!无法发送!");
}
(6)“停止监听”按钮的Click事件代码。
private void button3_Click(object sender, System.EventArgs e)
{
try {
sock.Close();
textBox3.AppendText ("主机"+textBox1.Text+"端口"+textBox2.Text+"监听停止!\r\n");
}
catch{MessageBox.Show("监听尚未开始,关闭无效!”);) }
TcpListener课本实例
Using System.Net;
Usint System.Net.Sockets;
Using system.Threading;
Private Socket mysocket;
Private TcpListener listener;
Private NetworkStream netStream;
Private bool control=false
Private void button1_Click(object sender,System.EventArgs e)
{
try
{
Listener = new TcpListener(Int32.Parse(textBox1.Text));
Listener.Start();
Thread thread = new Thread(new ThreadStart(recieve));
Thread.Start();
}
Catch(Exception e){}
}
Private void receive()
{
Mysocket = listener.AcceptSocket();
If(mysocket.Connected)
{
While(!control)
{
netStream ns = new NetworkStream(mySocket);
byte[] message = new Byte[64];
netStream.Read(message,0,message.Length);
String readMessage = System.Text.Encoding.BigEncianUnicode.GetString(message);
}
}
}
Private void button2_Click(object sender,System.EventArgs e)
{
netStream = new NetworkStream(mySocket);
String send =TextBox2.Text;
Byte[] message = System.Text.Encoding.BigEndianUnicode.GetBytes(sent.ToCharArray());
netStream.Write(message,0,message.Length);
netStream.Flush()
}
Private void button3_Click(object sender,System.EventArgs e)
{
Try
{
mySocket.Close();
Listen.Stop(); //只有服务器使用Stop,其他全用Close();
}
Catch{}
}
TcpClient课本实例
private void button_Click(object sender,System.EventArgs e)
{
Try
{
Int port = Int32.parse(textBox2.Text);//textbox2内容写的是端口号
Client = new TcpClient();
Client.Connect(textBox1.Text,port);//textbox1 内容写的是IP地址
Thread thread1 = new Thread(new ThreadStart(receive));
Thread1.Start()
}
Catch()
Public void receive()
{
While(!control)
{
netStream = Client.GetStream();
byte message[] = new Byte[1024];
netStream.Read(message,0,message.Length);
String readMessage = System.Text.Encoding.BigEndianUnicode.GetString(message);
}
}
}
Private void button2_Click(object sender,System.EventArgs e)
{
netStream = client.GetStream();
String send =TextBox2.Text;
Byte[] message = System.Text.Encoding.BigEndianUnicode.GetBytes(sent.ToCharArray());
netStream.Write(message,0,message.Length);
netStream.Flush()
}
Private void button3_Click(object sender,System.EventArgs e)
{
Try
{
Client.Close();
}
Catch{}
}