1. 網路風險處理流程》有幾個KCP點+)A.1+)B.2+)C.+3+)D,+4
咨詢記錄 · 回答於2021-12-11
2. 關於C語言編程
全是錯誤 連最基本的語法都不會
#include<stdio.h>
void xspjf(int *a[10])//a[]沒有類型 一下全是
{
int i;
for(i=0;i<10;i++)//這里要用分號不是『,』隔開
{
printf("%d",(float)(a[i][0]+a[i][1]+a[i][2]+a[i][3]+a[i][4])/5);
printf(" ");
}
}
void kcpjf(int *a[10])
{
int i;
for(i=0;i<5;i++)
{
printf("%d",(a[0][i]+a[1][i]+a[2][i]+a[3][i]+a[4][i]+a[5][i]+a[6][i]+a[7][i]+a[8][i]+a[9][i])/10);//這里是;不是逗號
printf(" ");
}
}
void zgf(int *a[5])
{
int i,j,t;
t=a[0][0];
for(i=0;i<10;i++)
for(j=0;j<5;j++)
{
if(a[i][j]>t)
{
t=a[i][j];
}
}
printf("%d,%d",i+1,j+1);
}
int ysrs(int *a[10])
{
int n,k=0;
for(n=0;n<10;n++)
{
if(a[n][0]>90&&a[n][1]>90&&a[n][2]>90&&a[n][3]>90&&a[n][4]>90)
k=k+1;//你這里是要做什麼啊?我給你換了下k=k+1
}
return k;
}
void main()
{
int i,j;
int a[10][5];
printf("請按順序輸入各學生的各科分數");
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
{
scanf("%d",&a[i][j]);
}
prinrf("\n");}
xspjf(a);
kcpjf(a);
printf("每個學生的平均分為:\n");
xspjf(a);
printf("\n");
printf("每個課程的平均分為:\n");//這兒不能有逗號 因為你後面沒有參數 下面也是
kcpjf(a);
printf("\n");
printf("成績單:");
for(i=0;i<10;i++)
{for(j=0;j<5;j++)
printf("%d",a[i][j]);
prinrf("\n");}
printf("最高分的學生的學號:%d課程為:%d");
zgf(a);
printf("5門科目分數都高於90分的人數為%d",ysrs(a));
}
3. Ngrok有時很不穩定,有什麼更好的內網穿透方法
以下內容來自公眾號逆鋒起筆,關注每日干貨及時送達
原文:v0w.top/2020/08/11/IntranetProxy
前言
本文以滲透的視角,總結幾種個人常用的內網穿透,內網代理工具,介紹其簡單原理和使用方法。
1、nps-npc1.1 簡介
nps是一款輕量級、高性能、功能強大的內網穿透代理伺服器。目前支持tcp、udp流量轉發,可支持任何tcp、udp上層協議(訪問內網網站、本地支付介面調試、ssh訪問、遠程桌面,內網dns解析等等……),此外還支持內網http代理、內網socks5代理、p2p等,並帶有功能強大的web管理端。
一台有公網IP的伺服器(VPS)運行服務端(NPS)
一個或多個運行在內網的伺服器或者PC運行客戶端(NPC)
- 1.2 特點
Go語言編寫
支持跨平台
支持多種協議的代理
web管理端
- 1.3 使用方法
- frp 是一個專注於內網穿透的高性能的反向代理應用,支持 TCP、UDP、HTTP、HTTPS 等多種協議。可以將內網服務以安全、便捷的方式通過具有公網 IP 節點的中轉暴露到公網。
- 2.2 特點
客戶端服務端通信支持 TCP、KCP 以及 Websocket 等多種協議。
埠復用,多個服務通過同一個服務端埠暴露。
跨平台,但是支持的比nps少一點
多種插件,提供很多功能
- 2.3 使用方法
- 以下內容摘自:https://segmentfault.com/a/11900000218768361. 通過 rdp 訪問家裡的機器
- EW 是一套攜帶型的網路穿透工具,具有 SOCKS v5服務架設和埠轉發兩大核心功能,可在復雜網路環境下完成網路穿透。但是,現在工具已經不更新了。。。
- 3.2 特點
輕量級,C語言編寫
可以設置多級代理
跨平台
但是只支持Socks5代理
- 3.3 使用方法以下使用方法均摘自:http://rootkiter.com/EarthWorm/
- 4.2 特點
官方維護,一般較為穩定
跨平台,閉源
有流量記錄和重發功能
- 4.3 使用方法
進入ngrok官網(https://ngrok.com/),注冊ngrok賬號並下載ngrok;
根據官網給定的授權碼,運行如下授權命令;
./ngrok authtoken 1hAotxhmORtzCYvUc3BsxDBPh1H_******************
./ngrok http 80即可將機器的80埠http服務暴露到公網,並且會提供一個公網域名。
內網滲透之內網穿透
開源內網穿透工具 frp 簡單使用教程
http://rootkiter.com/EarthWorm/
https://github.com/ehang-io/nps/releases
NPS
安裝配置
找到自己伺服器相應版本的server:
cd ~
wget https://github.com/cnlh/nps/releases/download/v0.23.2/linux_amd64_server.tar.gz
tar xzvf linux_amd64_server.tar.gz
cd ~/nps
在nps目錄下面會有一個nps可執行文件、conf配置目錄和web網頁目錄,我們只需要修改conf/nps.conf即可:
vim conf/nps.conf
需要改一下#web下面的幾個參數,
web_host= 伺服器IP或者域名
web_username= admin(登錄用戶名)
web_password= 你的密碼
web_port=8080(web管理埠)
修改#bridge可以更改 NPC的連接埠。比如我們拿到一台許可權受限的伺服器,有防火牆,可能只有部分埠(80,443)可以出網,就需要修改成出網埠。
##bridge
bridge_type=tcp
bridge_port=443 # 修改連接埠
bridge_ip=0.0.0.0
啟動
#Mac/Linux
./nps test|start|stop|restart|status 測試配置文件|啟動|停止|重啟|狀態
#Windows
nps.exe test|start|stop|restart|status 測試配置文件|啟動|停止|重啟|狀態
NPC
./npc -server=你的IP:8024 -vkey=唯一驗證密碼 -type=tcp
新建好客戶端後,也可以在+中看到,詳細的客戶端連接命令:
在客戶端界面可以通過新增的方式添加客戶端連接,每一個連接的vkey都是唯一區分的。
每一個客戶端,在建立連接後,都可以建立多個不同協議的隧道,這一個個隧道就是不同的代理了。
通過不同的協議和埠就可以連接代理的內網機器。
2、frp
2.1 簡介
下載: https://github.com/fatedier/frp/releases
1.修改 frps.ini 文件,為了安全起見,這里最好配置一下身份驗證,服務端和客戶端的 common 配置中的token參數一致則身份驗證通過:
# frps.ini
[common]
bind_port = 7000
# 用於身份驗證,請自行修改,要保證服務端與客戶端一致
token = abcdefgh
2.啟動 frps:
./frps -c ./frps.ini
3.修改 frpc.ini 文件,假設 frps 所在伺服器的公網 IP 為 x.x.x.x:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
# 用於身份驗證,請自行修改,要保證服務端與客戶端一致
token = abcdefgh
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 6000
4.啟動 frpc:
./frpc -c ./frpc.ini
5.通過 rdp 訪問遠程的機器,地址為:
x.x.x.x:6000
開機自啟
針對 Windows 系統,為了便於使用,可以配置一下開機的時候靜默啟動。
1.在 frpc.exe 的同級目錄創建一個 start_frpc.vbs:
'start_frpc.vbs
'請根據實際情況修改路徑
CreateObject("WScript.Shell").Run """D:Program Filesfrp_windows_amd64frpc.exe""" & "-c" & """D:Program Filesfrp_windows_amd64frpc.ini""",0
2.復制 start_frpc.vbs 文件,打開以下目錄,注意將
改為你的用戶名:
C:Users\ MenuProgramsStartup
3.滑鼠右擊,粘貼為快捷方式即可。
2. 通過 SSH 訪問公司內網機器
frps 的部署步驟同上。
1.啟動 frpc,配置如下:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
# 用於身份驗證,請自行修改,要保證服務端與客戶端一致
token = abcdefgh
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
2.通過 SSH 訪問內網機器,假設用戶名為 test:
ssh -oPort=6000 [email protected]
3. 通過自定義域名訪問部署於內網的 Web 服務
1.修改 frps.ini 文件,設置 http 訪問埠為 8080:
# frps.ini
[common]
bind_port = 7000
vhost_http_port = 8080
# 用於身份驗證,請自行修改,要保證服務端與客戶端一致
token = abcdefgh
2.啟動 frps:
./frps -c ./frps.ini
3.修改 frpc.ini 文件,假設 frps 所在的伺服器的 IP 為 x.x.x.x,local_port 為本地機器上 Web 服務對應的埠, 綁定自定義域名www.yourdomain.com:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
# 用於身份驗證,請自行修改,要保證服務端與客戶端一致
token = abcdefgh
[web]
type = http
local_port = 80
custom_domains = www.yourdomain.com
4.啟動 frpc:
./frpc -c ./frpc.ini
5 .將www.yourdomain.com的域名 A 記錄解析到 IPx.x.x.x,如果伺服器已經有對應的域名,也可以將 CNAME 記錄解析到伺服器原先的域名。
6.通過瀏覽器訪問http://www.yourdomain.com:8080即可訪問到處於內網機器上的 Web 服務。
4. 對外提供簡單的文件訪問服務
通過static_file插件可以對外提供一個簡單的基於 HTTP 的文件訪問服務。
frps 的部署步驟同上。
1.啟動 frpc,啟用static_file插件,配置如下:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
# 用於身份驗證,請自行修改,要保證服務端與客戶端一致
token = abcdefgh
[test_static_file]
type = tcp
remote_port = 6000
plugin = static_file
# 要對外暴露的文件目錄
plugin_local_path = /tmp/file
# 訪問 url 中會被去除的前綴,保留的內容即為要訪問的文件路徑
plugin_strip_prefix = static
plugin_http_user = abc
plugin_http_passwd = abc
2.通過瀏覽器訪問http://x.x.x.x:6000/static/來查看位於/tmp/file目錄下的文件,會要求輸入已設置好的用戶名和密碼。
常用功能
統計面板(Dashboard)
通過瀏覽器查看 frp 的狀態以及代理統計信息展示。
註:Dashboard 尚未針對大量的 proxy 數據展示做優化,如果出現 Dashboard 訪問較慢的情況,請不要啟用此功能。
需要在 frps.ini 中指定 dashboard 服務使用的埠,即可開啟此功能:
[common]
dashboard_port = 7500
# dashboard 用戶名密碼,默認都為 admin
dashboard_user = admin
dashboard_pwd = admin
打開瀏覽器通過http://[server_addr]:7500訪問 dashboard 界面,用戶名密碼默認為admin。
加密與壓縮
這兩個功能默認是不開啟的,需要在 frpc.ini 中通過配置來為指定的代理啟用加密與壓縮的功能,壓縮演算法使用 snappy:
# frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true
如果公司內網防火牆對外網訪問進行了流量識別與屏蔽,例如禁止了 SSH 協議等,通過設置use_encryption = true,將 frpc 與 frps 之間的通信內容加密傳輸,將會有效防止流量被攔截。
如果傳輸的報文長度較長,通過設置use_compression = true對傳輸內容進行壓縮,可以有效減小 frpc 與 frps 之間的網路流量,加快流量轉發速度,但是會額外消耗一些 CPU 資源。
[TLS
從 v0.25.0 版本開始 frpc 和 frps 之間支持通過 TLS 協議加密傳輸。通過在frpc.ini的common中配置tls_enable = true來啟用此功能,安全性更高。
為了埠復用,frp 建立 TLS 連接的第一個位元組為 0x17。
注意:啟用此功能後除 xtcp 外,不需要再設置 use_encryption。
代理限速
目前支持在客戶端的代理配置中設置代理級別的限速,限制單個 proxy 可以佔用的帶寬。
# frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
bandwidth_limit = 1MB
在代理配置中增加bandwidth_limit欄位啟用此功能,目前僅支持MB和KB單位。
范圍埠映射
在 frpc 的配置文件中可以指定映射多個埠,目前只支持 tcp 和 udp 的類型。
這一功能通過range:段落標記來實現,客戶端會解析這個標記中的配置,將其拆分成多個 proxy,每一個 proxy 以數字為後綴命名。
例如要映射本地 6000-6005, 6007 這 6 個埠,主要配置如下:
# frpc.ini
[range:test_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 6000-6006,6007
remote_port = 6000-6006,6007
實際連接成功後會創建 8 個 proxy,命名為test_tcp_0, test_tcp_1 ... test_tcp_7。
3、ew3.1 簡介
以下所有樣例,如無特殊說明代理埠均為1080,服務均為SOCKSv5代理服務.
該工具共有 6 種命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)。
1. 正向 SOCKS v5 伺服器
$ ./ew -s ssocksd -l 1080
2. 反彈 SOCKS v5 伺服器
這個操作具體分兩步:
a) 先在一台具有公網 ip 的主機A上運行以下命令:
$ ./ew -s rcsocks -l 1080 -e 8888
b) 在目標主機B上啟動 SOCKS v5 服務 並反彈到公網主機的 8888埠
$ ./ew -s rssocks -d 1.1.1.1 -e 8888
成功。
3. 多級級聯
工具中自帶的三條埠轉發指令, 它們的參數格式分別為:
$ ./ew -s lcx_listen -l 1080 -e 8888
$ ./ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 9999
$ ./ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999
通過這些埠轉發指令可以將處於網路深層的基於TCP的服務轉發至根前,比如 SOCKS v5。首先提供兩個「二級級聯」本地SOCKS測試樣例:
a)lcx_tran的用法
$ ./ew -s ssocksd -l 9999
$ ./ew -s lcx_tran -l 1080 -f 127.0.0.1 -g 9999
b)lcx_listen、lcx_slave的用法
$ ./ew -s lcx_listen -l 1080 -e 8888
$ ./ew -s ssocksd -l 9999
$ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999
再提供一個「三級級聯」的本地SOCKS測試用例以供參考
$ ./ew -s rcsocks -l 1080 -e 8888
$ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999
$ ./ew -s lcx_listen -l 9999 -e 7777
$ ./ew -s rssocks -d 127.0.0.1 -e 7777
數據流向:SOCKS v5 -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks
4、ngrok4.1 簡介
可以通過官網的UI界面查看數據包和流量等等(但是要付費==、)
還可以通過一些命令將內網的文件和其他TCP服務 暴露到公網中。
有授權的設置文件共享
ngrok http -auth="user:password" file:///Users/alan/share
無授權的設置文件共享
ngrok http "file:///C:\Users\alan\Public Folder"
將主機的3389的TCP埠暴露到公網
ngrok tcp 3389
更多使用方法參考:https://ngrok.com/docs
4. C語言統計文本字母出現次數按從大到小順序排,急用高分
#include <stdio.h>
#include <string.h>
void countc(int count[])
{
int index = 0;
char ch;
for (i = 0; i < 25; i++)
{
count[i] = 0;
}
FILE *fp = fopen("D:\\Data.txt", "r");
while((ch = fgetc(fp))!=EOF)
{
index = ch - 65;
if(index >= 0 && index < 26 ) count[index]++;
else
{
index = ch - 32;
if(index >= 0 && index < 26 ) count0[index]++;
}
}
}
void Swap(int &a,int &b)
{
a=a^b;
b=a^b;
a=a^b;
}
void main()
{
int cnt [26] = {0};
FILE *fp = fopen("D:\\Result.txt", "w");
countc(cnt);
char ch[26];
for(int i=0;i<26;i++)
{
ch[i]=i+65;//把字母賦值進數組
}
for (int i = 0; i < 26; i++)
{
for(int j=25;j>i;J--)
{
if(cnt[j]<cnt[j-1]])
{
Swap(cnt[j],cnt[j-1]);
ch[j]=ch[j]^ch[j-1];
ch[j-1]=ch[j]^ch[j-1];
ch[j]=ch[j]^ch[j-1];
}
}
}
for(int i=0;i<26;i++)
{
cout<<ch[i]<<"字母個數為"<<cnt[i]<<endl;
}
getchar();
}
5. C語言編程
#include <io.h>
#include <stdlib.h>
#include <stdio.h>
/*定義學生成績結構體*/
struct stuscore
{
char szID[80];/*學號*/
char szName[80];/*姓名*/
int iEn;/*英語*/
int iCp;/*C程序*/
int iMt;/*數學*/
};
/*輸入成績並保存文件*/
void InputScore(void)
{
stuscore astu;
FILE *pf;
printf("輸入學號 = ");
scanf("%s",astu.szID);
printf("輸入名字 = ");
scanf("%s",astu.szName);
printf("輸入英語 = ");
scanf("%d",&astu.iEn);
printf("輸入C程序 = ");
scanf("%d",&astu.iCp);
printf("輸入數學 = ");
scanf("%d",&astu.iMt);
/*如果文件不存在則創建*/
if ( _access("stu.txt",0) == -1 )
{
pf = fopen("stu.txt","wt");
}
else
{
pf = fopen("stu.txt","a+");
}
fprintf(pf,"%s %s %d %d %d\n",astu.szID,astu.szName,astu.iEn,astu.iCp,astu.iMt);
fclose(pf);
}
/*計算平均分保存文件*/
void JsPjf(void)
{
stuscore astu;
FILE *pf_read = fopen("stu.txt","rt");
FILE *pf_write = fopen("pjf.txt","wt");
while( ! feof(pf_read) )
{
fscanf(pf_read,"%s %s %d %d %d\n",astu.szID,astu.szName,&astu.iEn,&astu.iCp,&astu.iMt);
fprintf(pf_write,"%s %s %d",astu.szID,astu.szName,(astu.iEn+astu.iCp+astu.iMt)/3);
}
fclose(pf_read);
fclose(pf_write);
}
/*統計每門課程平均分並寫文件*/
void TjKcPjf(void)
{
stuscore astu;
int iTotalEn = 0,iTotalCp = 0,iTotalMt = 0;
FILE *pf_read = fopen("stu.txt","rt");
FILE *pf_write = NULL;
int iNumber = 0;
while( ! feof(pf_read) )
{
fscanf(pf_read,"%s %s %d %d %d\n",astu.szID,astu.szName,&astu.iEn,&astu.iCp,&astu.iMt);
iTotalEn += astu.iEn;
iTotalCp += astu.iCp;
iTotalMt += astu.iMt;
iNumber++;
}
fclose(pf_read);
pf_write = fopen("kcpj.txt","wt");
fprintf(pf_write,"英語平均分:%d\n",iTotalEn/iNumber);
fprintf(pf_write,"C語言平均分:%d\n",iTotalCp/iNumber);
fprintf(pf_write,"數學平均分:%d\n",iTotalMt/iNumber);
fclose(pf_write);
}
/*菜單*/
void ShowMenu(void)
{
char c = 0;
while( true )
{
system("cls");
printf("請選擇:\n");
printf("1 輸入學生成績.\n");
printf("2 計算學生平均成績.\n");
printf("3 計算課程平均成績.\n");
printf("0 退出.\n");
printf("\n輸入 = ");
fflush(stdin);
c=getchar();
fflush(stdin);
if ( c < '0' || c > '9' )
{
continue;
}
switch( c )
{
case('0'):
{
exit(0);
break;
}
case('1'):
{
InputScore();
break;
}
case('2'):
{
JsPjf();
break;
}
case('3'):
{
TjKcPjf();
break;
}
default:
{
continue;
}
}
}
}
/*剩下的功能參照上面的格式自己做一下就OK了*/
int main(void)
{
ShowMenu();
return 0;
}
6. kuka iiwa如何兩點移動
下面分享幾個庫卡KUKA機器人在使用過程中可能出現的一些小問題及解決辦法。
KUKA機器人常見問題及解決方案
1 .開機坐標系無效
世界坐標系是以槍頭為基點,在這種坐標系中機器人所有的動作都是按照以槍頭為頂點來完成移動,XYZ方向切割槍方向不改變,如果機器人在世界坐標系中移動,槍頭也隨著改變方向,那就是我們在開機後沒有選擇工具。
解決方案:配置→當前工具/基坐標→工具號→1
2. 專家登陸
一般情況,開機後我們要編輯程序時,首先我們要登陸專家級別,有助於我們操作。
解救方案:配置→用戶組→專家→登陸→密碼KUKA→登陸
3. 設置END
新建程序我們發現沒有終點,我們要設置終點。
解決方案:配置→雜項→編輯器→定一行DEF
4. 程序第一條設置為home位置
編輯程序時,第一條指令要設為home位置,這時我們在最後可以直接找到home位置的標准,可以節省手動移動機器人的操作時間。
5 .手動關閉輸出信號
當我們在測試程序或者正常使用時(已經打開了輸出信號),有時候會遇到突發情況,比如說程序路徑有撞車危險,或者預熱失敗,程序錯誤等等,這時候我們要手動關閉輸出信號。在問題解決完畢後我們可以再次用kcp打開輸出信號。(其中我們的輸出信號是3是低壓氧,4是高壓氧,5是丙烷)
解決方案:顯示→輸入/輸出端→數字輸出端→按住驅動→數(關閉或者打開)
6. 6D滑鼠失效
系統指示6D滑鼠仍然有電壓之類的提示,滑鼠失效了,我們這時可以松開驅動,從新按下去等待驅動指示 I 變為綠色即可。
7 .從電腦中拷貝程序
電腦中拷貝程序,以便C盤中程序丟失後,我們可以從D盤或者外部移動U盤中拷貝使用。
解決方案:專家登陸後→按Num(此時顯示器上Num為灰色,在按一下轉換回來)→CTRL(2)+Esc→電腦C盤→KRC→ROBOTER→KRC→R1→Program
8. 機器人保護
當機器人撞車後,會啟動自動保護,也就是機器人在A6軸處有一個保護系統,當撞車後彈簧被壓彎變形,系統接收到信號後會停止一切操作,此時我們無法操作機器人,這時候我們要先關掉保護開關。
解決方案:配置→輸入/輸出端→外部自動→允許運動→把5改成1025→此時機器人就不受系統保護限制可以移動,注意調節機器人運動方向,調整運動速度,離開撞車點,到達安全位置後把「允許運動」的數值調成5 即可。
9. 下列情況下KUKA機器人需要重新標定零點
機器人沒有完全關閉下,蓄電池電量消耗殆盡後會丟失零點。
機器人撞到硬限位了時,會丟失零點。
手動刪除零點。
開機失效,直接就關機會丟失零點。
10. 程序數據參數
切割速度 直線和圓弧都是0.005m/s ,加速度1%
機器人移動速度PTP是20% 或者10%
7. Unity網路編程(一)常見概念
一直用Http用多了 復習一下基礎
Unity通訊一般分為2類
Http : 應用層 Unity內置的UnityWebRequest類進行通信(之前寫過一個分發器垃圾框架)用於交互量比較小
Socket:傳輸層 比較底層 實現TCP/UDP 用於頻繁的通信
這個是基於TCP 和IP傳輸不同消息
這個是三種常見的網路層次劃分
基本數據單位為幀
主要的協議:乙太網協議
基本數據單位為IP數據報;
IP協議(Internet Protocol,網際網路互聯協議)
ICMP協議(Internet Control Message Protocol,網際網路控制報文協議)
ARP協議(Address Resolution Protocol,地址解析協議)
RARP協議(Reverse Address Resolution Protocol,逆地址解析協議)
包含的主要協議:TCP協議(Transmission Control Protocol,傳輸控制協議)、UDP協議(User Datagram Protocol,用戶數據報協議)
數據傳輸基本單位為報文
包含的主要協議:
FTP(文件傳送協議)、Telnet(遠程登錄協議)、DNS(域名解析協議)、SMTP(郵件傳送協議),POP3協議(郵局協議),HTTP協議(Hyper Text Transfer Protocol)。
分配給用戶上網使用的網際協議
目前IPv4多 比如192.168.1.1
新的IPv6(因為IPv4數量不夠分配)如3ffe:3201:1401:1280:c8ff:fe4d:db39:1984。
Internet最基本的協議
TCP負責發現傳輸的問題,一有問題就發出信號,要求重新傳輸,直到所有數據安全正確地傳輸到目的地。
可靠的協議 通過三次握手建立的面向連接通信協議
3次握手 四次揮手 實習生常考
TCP連接建立過程(三次握手):
1.首先Client端發送連接請求報文
2.Server段接受連接後回復ACK報文,並為這次連接分配資源。
3.Client端接收到ACK報文後也向Server段發生ACK報文,並分配資源,這樣TCP連接就建立了。
TCP連接斷開過程(四次揮手):
1.Client端發起中斷連接請求(FIN報文)
2.Server端接到FIN報文後,發送ACK伺服器還有消息沒發完讓Client待命,Client端就進入FIN_WAIT,繼續等待Server端的FIN報文
3.Server端確定數據已發送完成,則向Client端發送FIN報文,
4.Client端收到FIN報文後發送ACK後進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳,Server端收到ACK後 關閉,Client等待了2MSL後依然沒有收到回復客戶端也關閉
SYN:"synchronize"請求同步標志;;ACK:"acknowledge"確認標志";FIN:"Finally"結束標志。
為什麼要三次握手?
防止因為網卡導致Sever收到多次Client請求 建立N個監聽 造成資源浪費
為什麼要四次揮手?
自己不請求直接關閉 但是伺服器還能給你發數據 伺服器浪費資源 而且客戶端也會強行接收
使用TCP的協議:FTP(文件傳輸協議)、Telnet(遠程登錄協議)、SMTP(簡單郵件傳輸協議)、POP3(和SMTP相對,用於接收郵件)、HTTP協議等。
面向無連接的通訊協議
UDP通訊時不需要接收方確認,屬於不可靠的傳輸 會丟包
UDP與TCP位於同一層,但它不管數據包的順序、錯誤或重發
主要用於面向查詢---應答的程序
每個UDP報文分UDP報頭和UDP數據區兩部分
UDP報頭由4個域組成,其中每個域各佔用2個位元組
(1)源埠號;
(2)目標埠號;
(3)數據報長度;
(4)校驗值。
使用UDP協議包括:TFTP(簡單文件傳輸協議)、SNMP(簡單網路管理協議)、DNS(域名解析協議)、NFS、BOOTP。
超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網路協議
HTTP協議特點:
簡單快速 靈活 無連接 無狀態 支持B/S(瀏覽器/伺服器)及C/S(客戶端/伺服器)模式。
URL
和伺服器有一些頻繁的交互 用http時不時請求 叫輪詢 效率低下
soket可以理解為插座 插頭接上了可以保持通信
埠:
每個Socket連接都是從一台計算機網卡的一個埠連接到另外一台計算機網卡的某個埠。
IP是房子的話 埠就是門
TCP埠和UDP埠相互獨立 如TCP255埠 和UDP255埠 不沖突
周知埠
范圍從0到1023,其中80埠分配給WWW服務,21埠分配給FTP服務等。
瀏覽器的地址欄里輸入一個網址的時候是不必指定埠號的,因為在默認情況下WWW服務的埠是「80」。
網路服務是可以使用其他埠號的 比如 網址:8080
但是有些系統協議使用固定的埠號,它是不能被改變的,比如139 埠專門用於NetBIOS與TCP/IP之間的通信,不能手動改變。
自己開發時盡量不要使用1024之下的埠,可能會與系統埠沖突。
服務端:
創建socket對象
bind:綁定IP地址和埠
listen:開始監聽綁定的IP地址和埠,等待客戶端的連接
accept:如果有客戶端發起連接,通過accept接受連接請求,連接成功後會復制一個socket出來用於和當前接受連接的客戶端進行通信。(服務端最初創建的那個socket只是用來監聽並建立連接用的,實際和客戶端通信並不是最初的socket,而是在accept這一步會自動創建一個新的socket出來和客戶端通信。)
read/write:使用新的socket讀寫數據
close:關閉socket,如果關閉的是服務端的監聽socket,則無法接收新的連接,但是已經創建的和客戶端的連接不會被關閉。
客戶端:
創建socket對象
connect:連接服務端,連接成功後系統會自動分配埠
read/write:連接成功後,就可以進行數據的讀寫了,這里讀寫使用的socket還是第一步創建的socket對象。
close:關閉連接。
如果收到了長度為0的數據,則代表遠程socket關閉了連接。
伺服器:
創建socket對象
bind:綁定IP和埠,用於接收數據(注意這里綁定完就可以直接接收數據了,並不需要等待連接)
read/write:讀寫數據
客戶端:
創建socket對象
read/write:讀寫數據,不需要先建立連接,直接給對應的IP+埠發送數據即可。
由於沒有建立連接以及連接的保障,UDP在傳輸效率上會很高
UDP有一個功能是TCP所不具備的,那就是廣播功能(UDP可以將消息發送到在同一廣播網路上的每個主機 CS、魔獸爭霸區域網對戰)。
HTTP/HTTPS(比http更安全):小游戲 網頁 間歇性發送鏈接 偶爾延遲。
TCP長連接: 卡牌游戲 某些mmo 客戶端和伺服器都可以獨立發包 偶爾延遲
UDP:動作游戲 mmo 槍戰 客戶端和伺服器都可以獨立發包 無法接受延遲
可以混合使用你的MMO客戶端也許首先使用HTTP去獲取上一次的更新內容,然後使用UDP跟游戲伺服器進行連接。
現在也有kcp 就是tcp和udp結合 快速安全可靠
簡單直接的長連接
可靠的信息傳輸
數據包的大小沒有限制
坑多 斷線檢測、慢速客戶端響應阻塞數據包,對開放連接的各種dos攻擊,阻塞和非阻塞IO模型
丟包會有阻塞機制(一般是重發 tcp相反) 所以手機游戲ping跳1000就這個原因
只使用一個socket進行通信
快速
基於數據包構建
靈活 多種方式處理延遲
很多東西沒有要自己構建
不可靠
丟包
客戶端直接開始進行計算而不等待服務端確認是一種典型的隱藏延遲的技術(容易被抓包篡改)。
我們到底是使用TCP還是UDP取決於我們能否隱藏延遲。
比如TCP 在棋牌 卡牌游戲 卡1S無所謂 在動作游戲moba游戲就很致命
可靠的UDP/kcp和TCP不一樣,要去實現一個特殊的阻塞控制,而且還要保證可靠性,也可以使用許多支持可靠通信的UDP庫,但是庫一般為了通用會降低某種新能,自己根據項目情況寫可以發揮到極致
如果不知道用什麼就TCP
8. KCP協議到底是個什麼東西,和UDP有什麼關系
kcp協議是傳輸層的一個具有可靠性的傳輸層ARQ協議。它的設計是為了解決在網路擁堵情況下tcp協議的網路速度慢的問題。kcp力求在保證可靠性的情況下提高傳輸速度。kcp協議的關注點主要在控制數據的可靠性和提高傳輸速度上面,因此kcp沒有規定下層傳輸協議,一般用udp作為下層傳輸協議,kcp層協議的數據包在udp數據報文的基礎上增加控制頭。當用戶數據很大,大於一個udp包能承擔的范圍時(大於mss),kcp會將用戶數據分片存儲在多個kcp包中。因此每個kcp包稱為一個分片。
9. 任意輸入n個整數,分別統計奇數的和,奇數的個數,偶數的和,偶數的個數.C語言
#include<stdio.h>;
intmain(intargc,char**argv){
inti,n,m,jh=0,oh=0,jg=0,og=0;
printf("請輸入n值: ");
scanf("%d",&n);//先輸入數據數n
printf("請輸入%d數,按空格鍵隔開: ",n);
for(i=0;i<n;i++){
scanf("%d",&m);
if(m%2!=0){
jh=jh+m;
jg++;
}else{
oh=oh+m;
og++;
}
}//利用循環輸入n數並計算
printf(" 奇數數:%d 奇數和:%d 偶數數:%d 偶數和:%d ",jg,jh,og,oh);//列印
return0;
}