linuxでのrtoの設定とrtoテスト

6637 ワード

rto修正コマンド


sudo ip route change 172.16.100.0/24 dev eth0 rto_min 5(単位デフォルトms)

rtoテスト


  1、socketネットワークプログラムテストを作成し、クライアントはずっとサービス側にデータ(テストクライアントのrto)を送信し、クライアントとサーバ側の通信過程で、サービス側がクライアントに通信するルート項目を削除する.  2、クライアントはwiresharkを通じてパケットをつかむことで、rtoの変化規則(指数退避)を分析することができる.  3、テストコードは以下の通りです.
 

#include 
#include 
#include 
#include 
#include 
#include 
#include 


int main(){
    char buf[100];
    int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    struct sockaddr_in dst;
    if(fd == -1){
        printf("Create socket error
"
); return 0; } dst.sin_family = AF_INET; dst.sin_port = htons(8000); dst.sin_addr.s_addr = inet_addr("127.0.0.1"); if(connect(fd, (struct sockaddr*)&dst, sizeof(struct sockaddr)) == -1){ printf("Connet error
"
); return 0; } while(1){ if(send(fd, "hello,world!
"
, 13, 0) != 13){ printf("Send error
"
); return 0; } sleep(1); } return 0; }
 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int fd_all[100];

void *server(void *fd_addr){
    char buf[101];
    int fd = *((int *)fd_addr);
    while(1){
        if(recv(fd, buf, 100, 0) <= 0){
            printf("no data
"
); break; } printf("%s
"
, buf); } close(fd); return NULL; } int main(){ int fd, new_fd; struct sockaddr_in my_addr, new_addr; fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if(fd == -1){ printf("crate socket error
"
); return 0; } my_addr.sin_family = AF_INET; my_addr.sin_port = htons(8000); my_addr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(fd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) < 0){ printf("bind error
"
); return 0; } listen(fd, 10); while(1){ int size = sizeof(struct sockaddr); new_fd = accept(fd, (struct sockaddr*)&new_addr, &size); if(new_fd == -1){ printf("accept error
"
); return 0; }else{ pthread_t ntid; if(pthread_create(&ntid, NULL, server, &new_fd) < 0){ printf("create thread error
"
); return 0; } } } return 0; }