TCP/IP协议分析期末知识整理

本文详细介绍了网络工程中的常用命令,如ping、tracert、ARP、路由命令及IP协议等。还涵盖了TCP三次握手、四次挥手,FTP和HTTP协议的工作原理,以及Socket编程的基础知识,包括TCPClient和TCPListener的使用。同时,文章也涉及了网络编程的重点,如Socket的构造、绑定、监听、连接和数据传输等。
摘要由CSDN通过智能技术生成

大二网络工程专业期末知识整理

常用网络命令

ping命令(看不到自己IP地址)

Ping -f 在数据包中设置不分段(如果大于MTU会报错)

Ping -i 生存时间

Ping -4使用IPv4

Ping -a将地址解析到主机名称

tracert命令(看不到自己IP地址)

arp命令(看得到IP地址)

  1. arp -a 显示所有缓存表
  2. arp -d 删除某个缓存表
  3. 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地址

  1. 全是255的地址:广播地址
  2. 全0地址:在网络中的我自己(192.168.0.1进入外网)
  3. 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 保持连接

  1. 请求头
  1. Accept 表示客户端希望接受的资源
  2. Accept-Charset 用户接受的字符集(字符编码)
  3. Accept-Encoding 用户接受的文件编码
  4. Accept-Language 接受的自然语言
  5. Host 客户端指定自己想访问的域名/IP地址和端口号
  6. User-Agent 允许客户端告诉服务器自己的操作系统
  1. 响应头
  1. Location 重定向到新的位置
  2. Server 服务器软件信息
  3. WWW-Authenticate 401报文中响应消息(验证机制)

  1. 实体头
  1. Content-Encoding 文档的编码方式
  2. Content-Type 发送/接受的MIME类型

如:text/html charset等

  1. Content-Length   内容长度
  2. 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:

  1. 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);

  1. 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{}

}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值