1. 네트워크 관련 명령어
1. telnet
- 원격 컴퓨터에 로그인하고 명령을 실행 할 수 있는 텍스트 기반의 네트워크 프로토콜
- 기본적인 tcp 연결 생성용으로 사용
2. nc
- 다양한 네트워크 작업을 수행할 수 있는 커맨드라인 도구
- TCP 및 UDP 프로토콜을 사용하여 소켓을 열고 데이터를 송수힌 할 수 있으며, 클라이언트와 서버 간의 연결을 설정
1. TCP/UDP 연결
1. TCP 연결
nc [opt] [host] [port]
2. UDP 연결
nc -u [opt] [host] [port]
2. 파일 전송
1. 수신 측
nc -l [port] > [filename]
2. 송신 측
nc [host][port] < [filename]
3. 포트 스캔
nc -zv [host] [port-range]
- -zv 옵션: 포트 스캔 모드를 설정
- -z 옵션: 아무 데이터를 전송하지 않고, listening daemon 들만 스캔
- -v 옵션: 상세 정보를 출력
3. ifconfig
- 네트워크 인터페이스의 설정을 확인하고 변경하는 명령어
1. ifconfig
- 현재 시스템에 설정된 네트워크 인터페이스의 정보를 출력
2. ifconfig [인터페이스명]
3. ifconfig [인터패이스명][ip주소][넷마스크]
- 특정 네트워크 인터페이스의 ip주소와 넷마스크를 설정
4. ifconfig [인터페이스명][up/down]
- 특정 네트워크 인터페이스를 활성화 또는 비활성화
4. ping
5. traceroute
- 목적지까지 패킷이 어떤 경로를 통해 전송되는지 추적
1. traceroute [호스트명/ip주소]
- 해당 호스트나 IP주소로 ICMP 패킷을 보내서 경로를 추적
6. netstat
7. dig
- DNS(Domain Name System) 조회를 수행
8. ssh
- 원격 서버에 안전하게 로그인하고, 컴퓨터간에 파일을 전송
9. scp
- ssh 프로토콜을 사용하여 로컬과 원격 시스템 간에 파일을 복사
1. scp [옵션][원본파일][대상경로]
- -r: 디렉토리를 복사
- -P: ssh 포트를 지정
- -v: 디버그 모드로 실행
10.curl, wget
- 웹 페이지나 파일을 다운로드
- 주로 HTTP, HTTPS, FTP 등의 프로토콜을 사용하여 데이터를 전송
1. curl [옵션][URL]
- -i: 헤더 정보를 출력
- -X: HTTP 메소드를 지정
- -H: HTTP 요청 헤더를 지정
- -d: POST 요청 시 전송할 데이터를 지정
- -o: 출력 파일을 지정
2. REST API 호출
- API 엔드포인트 URL 과 HTTP 메소드, 요청 헤더, 전송할 데이터 등을 지정
API
curl 명령
11. tcpdump
- 네트워크 패킷을 캡쳐하고 분석하기 위한 명령어
- 패킷 분석 및 디버깅, 보안 감사 등에 사용
1. tcpdump [옵션][식별자]
- -i:캡처할 인터페이스를 지정
- -n: IP 주소 및 포트 번호를 숫자 형태로 출력
- -s: 캡처할 패킷의 최대 크기를 지정
- -v: 패킷을 자세하게 출력
- -c: 캡처할 패킷의 수를 지정
- -w: 캡처한 패킷을 파일에 저장
2. tcpdump host [ip주소]
- 특정 IP 주소에서 전송되는 모든 패킷을 캡쳐
3. tcpdump port [port]
4. tcpdump [protocol]
2. 네트워크 응용 개요
1. 네트워크의 종류
1. 클라이언트 - 서버 방식

2. P2P(peer to peer) 방식

2. 소켓
- 컴퓨터들간의 통신을 가능하게 하는 엔드포인트
- 소켓을 사용하여 서버와 클라이언트 간에 데이터를 전송
1. 스트림 소켓
- 전송 제어 프로토콜(TCP)을 기반으로 하는 소켓
- 연결 지향적이며 신뢰성 있는 데이터 전송
- 웹 브라우징, 이메일 전송 등의 애플리케이션에서 주로 사용
2. 데이터그램 소켓
- 사용자 데이터그램 프로토콜(UDP)을 기반으로 하는 소켓
- 비연결 지향적이며 신뢰성이 떨어지지만 속도가 빠름
- 데이터 전송 순서를 보장하지 않음
- 음성 및 동영상 스트리밍, 온라인 게임 등의 애플리케이션에서 주로 사용
3. TCP
1. TCP 서버
1. server.c 코드
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char *argv[]) {
struct sockaddr_in server, remote;
int request_sock, new_sock;
int bytesread, addrlen;
int i;
char buf[BUFSIZ];
if (argc != 2) {
(void) fprintf(stderr,"usage: %s port\n", argv[0]);
exit(1);
}
if ((request_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror("socket");
exit(1);
}
memset((void *) &server, 0, sizeof (server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
printf("%d\n", INADDR_ANY);
server.sin_port = htons((u_short)atoi(argv[1]));
if (bind(request_sock, (struct sockaddr *)&server, sizeof (server)) < 0) {
perror("bind");
exit(1);
}
if (listen(request_sock, SOMAXCONN) < 0) {
perror("listen");
exit(1);
}
for (;;) {
addrlen = sizeof(remote);
new_sock = accept(request_sock,
(struct sockaddr *)&remote, (socklen_t *)&addrlen);
if (new_sock < 0) {
perror("accept");
exit(1);
}
printf("connection from host %s, port %d, socket %d\n",
inet_ntoa(remote.sin_addr), ntohs(remote.sin_port), new_sock);
for (;;) {
bytesread = read(new_sock, buf, sizeof (buf) - 1);
if (bytesread<=0) {
printf("server: end of file on %d\n", new_sock);
if (close(new_sock))
perror("close");
break;
}
buf[bytesread] = '\0';
printf("%s: %d bytes from %d: %s\n",
argv[0], bytesread, new_sock, buf);
for(i = 0; i < bytesread; i++)
buf[i] = toupper(buf[i]);
if (write(new_sock, buf, bytesread) != bytesread)
perror("echo");
}
}
}
2. 동작 모습


2. TCP 클라이언트
1. client.c 코드
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
int main(int argc, char *argv[])
{
struct hostent *hostp;
struct sockaddr_in server;
int sock;
char buf[BUFSIZ];
int bytesread;
if(argc != 3)
{
(void) fprintf(stderr,"usage: %s host port\n", argv[0]);
exit(1);
}
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror("socket");
exit(1);
}
if ((hostp = gethostbyname(argv[1])) == 0) {
fprintf(stderr,"%s: unknown host\n",argv[2]);
exit(1);
}
memset((void *) &server, 0, sizeof (server));
server.sin_family = AF_INET;
memcpy((void *) &server.sin_addr, hostp->h_addr, hostp->h_length);
server.sin_port = htons((u_short)atoi(argv[2]));
if (connect(sock, (struct sockaddr *)&server, sizeof (server)) < 0) {
(void) close(sock);
fprintf(stderr, "connect");
exit(1);
}
for (;;) {
if (!fgets(buf, sizeof buf, stdin)) {
close(sock);
exit(0);
}
if (write(sock, buf, strlen(buf)) < 0) {
perror("write");
exit(1);
}
bytesread = read(sock, buf, sizeof buf - 1);
buf[bytesread] = '\0';
printf("%s: got %d bytes: %s\n", argv[0], bytesread, buf);
}
}
2. 동작 모습




4. UDP
1. UDP 서버
1. udpserver.c 코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
int sockid, nread, addrlen;
int i;
struct sockaddr_in my_addr, client_addr;
char msg[50];
if(argc != 2)
{
printf("%s port\n", argv[0]);
return 0;
}
printf("Server: creating socket\n");
if ( (sockid = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{ printf("Server: socket error: %d\n",errno); exit(0); }
printf("Server: binding my local socket\n");
memset((char *) &my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = INADDR_ANY;
my_addr.sin_port = htons(atoi(argv[1]));
if ( (bind(sockid, (struct sockaddr *) &my_addr,
sizeof(my_addr)) < 0) )
{ printf("Server: bind fail: %d\n",errno); exit(0); }
while(1) {
memset((char *) &client_addr, 0, sizeof(client_addr));
addrlen = sizeof(client_addr);
printf("Server: starting blocking message read\n");
nread = recvfrom(sockid,msg,sizeof (msg) - 1 ,0,
(struct sockaddr *) &client_addr, (socklen_t *)&addrlen);
printf("message from host %s, port %d, addrlen %d socket %d\n",
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), addrlen, sockid);
printf("Server: retrun code from read is %d\n",nread);
msg[nread] = '\0';
if (nread >0) printf("Server: message is: %s\n",msg);
for(i = 0; i < nread; i++)
msg[i] = toupper(msg[i]);
sendto(sockid, msg,strlen(msg),0,(struct sockaddr *) &client_addr,
addrlen);
}
close(sockid);
}
2. 동작 모습


2. UDP 클라이언트
1. udpcli.c 코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int sockid, retcode;
int addrlen, nread;
struct hostent *hostp;
struct sockaddr_in my_addr, server_addr;
char msg[128];
if(argc != 4)
{
printf("%s myport serveraddr serverport\n", argv[0]);
return 0;
}
printf("Client: creating socket\n");
if ( (sockid = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{ printf("Client: socket failed: %d\n",errno); exit(0); }
printf("Client: binding my local socket\n");
memset((char *) &my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
my_addr.sin_addr.s_addr = inet_addr(argv[2]);
my_addr.sin_port = htons(atoi(argv[1]));
if ( (bind(sockid, (struct sockaddr *) &my_addr,
sizeof(my_addr)) < 0) )
{ printf("Client: bind fail: %d\n",errno); exit(0); }
if ((hostp = gethostbyname(argv[2])) == 0) {
fprintf(stderr,"%s: unknown host\n",argv[2]);
exit(1);
}
printf("Client: creating addr structure for server\n");
bzero((char *) &server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[2]);
memcpy((void *) &server_addr.sin_addr, hostp->h_addr, hostp->h_length);
server_addr.sin_port = htons((u_short)atoi(argv[3]));
printf("Client: initializing message and sending\n");
sprintf(msg, "Hello world");
retcode = sendto(sockid,msg,strlen(msg),0,(struct sockaddr *) &server_addr,
sizeof(server_addr));
if (retcode <= -1)
{printf("client: sendto failed: %d\n",errno); exit(0); }
printf("Client: Successful\n");
nread = recvfrom(sockid, msg, sizeof (msg) - 1 ,0,
(struct sockaddr *) &server_addr, (socklen_t *)&addrlen);
msg[nread] = '\0';
printf("From Server: %s\n", msg);
close(sockid);
}
2. 동작 모습


5. Multiplexing File Descriptors
1. select()
- I/O 멀티플렉싱 시스템 콜, 여러 개의 파일 디스크립터를 감사
- 어떤 디스크립터가 읽거나 쓰기 상태가 가능한 상태인지 확인하여 해당 디스크립터를 선택
- 이를 통해 단일 프로세스가 여러 개의 I/O 요청을 동시에 처리
- select() 함수가 호출되면, 블로킹 되어있다가 어떤 파일 디스크립터가 선택되면 반환
- select() 함수가 반환한 뒤, 선택된 파일 디스크립터에 대해 처리를 수행
2. Multiplexing Server, Client
1. serverorg.c 코드
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
int main(int argc, char *argv[]) {
struct sockaddr_in server, remote;
int request_sock, new_sock;
int i, nfound, fd, maxfd, bytesread, addrlen;
fd_set rmask, mask;
static struct timeval timeout = { 5, 0 };
char buf[BUFSIZ];
if (argc != 2) {
(void) fprintf(stderr,"usage: %s port\n",argv[0]);
exit(1);
}
if ((request_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror("socket");
exit(1);
}
memset((void *) &server, 0, sizeof server);
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons((u_short)atoi(argv[1]));
if (bind(request_sock, (struct sockaddr *)&server, sizeof server) < 0) {
perror("bind");
exit(1);
}
if (listen(request_sock, SOMAXCONN) < 0) {
perror("listen");
exit(1);
}
FD_ZERO(&mask);
FD_SET(request_sock, &mask);
maxfd = request_sock;
for (;;) {
rmask = mask;
nfound = select(maxfd + 1, &rmask, (fd_set *)0, (fd_set *)0, &timeout);
if (nfound < 0) {
if (errno == EINTR) {
printf("interrupted system call\n");
continue;
}
perror("select");
exit(1);
}
if (FD_ISSET(request_sock, &rmask)) {
addrlen = sizeof(remote);
new_sock = accept(request_sock,
(struct sockaddr *)&remote, (socklen_t *)&addrlen);
if (new_sock < 0) {
perror("accept");
exit(1);
}
printf("connection from host %s, port %d, socket %d\n",
inet_ntoa(remote.sin_addr), ntohs(remote.sin_port),
new_sock);
FD_SET(new_sock, &mask);
if (new_sock > maxfd)
maxfd = new_sock;
FD_CLR(request_sock, &rmask);
}
for (fd = 4; fd <= maxfd ; fd++) {
if (FD_ISSET(fd, &rmask)) {
bytesread = read(fd, buf, sizeof (buf) - 1);
if (bytesread < 0) {
perror("read");
}
if (bytesread<=0) {
printf("server: end of file on %d\n",fd);
FD_CLR(fd, &mask);
if (close(fd)) perror("close");
continue;
}
buf[bytesread] = '\0';
printf("%s: %d bytes from %d: %s\n",
argv[0], bytesread, fd, buf);
for(i = 0; i < bytesread; i++)
buf[i] = toupper(buf[i]);
if (write(fd, buf, bytesread) != bytesread)
perror("echo");
}
}
}
}
2. clientorg.c 코드
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <netdb.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char *argv[]) {
struct hostent *hostp;
struct sockaddr_in server;
int sock;
static struct timeval timeout = { 5, 0 };
fd_set rmask, xmask, mask;
char buf[BUFSIZ];
int nfound, bytesread;
if (argc != 3) {
(void) fprintf(stderr,"usage: %s host port\n",argv[0]);
exit(1);
}
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror("socket");
exit(1);
}
if ((hostp = gethostbyname(argv[1])) == 0) {
fprintf(stderr,"%s: unknown host\n",argv[1]);
exit(1);
}
memset((void *) &server, 0, sizeof server);
server.sin_family = AF_INET;
memcpy((void *) &server.sin_addr, hostp->h_addr, hostp->h_length);
server.sin_port = htons((u_short)atoi(argv[2]));
if (connect(sock, (struct sockaddr *)&server, sizeof (server)) < 0) {
(void) close(sock);
perror("connect");
exit(1);
}
FD_ZERO(&mask);
FD_SET(sock, &mask);
FD_SET(fileno(stdin), &mask);
for (;;) {
rmask = mask;
nfound = select(FD_SETSIZE, &rmask, (fd_set *)0, (fd_set *)0, &timeout);
if (nfound < 0) {
perror("select");
exit(1);
}
if (FD_ISSET(fileno(stdin), &rmask)) {
if (!fgets(buf, sizeof (buf) - 1, stdin)) {
if (ferror(stdin)) {
perror("stdin");
exit(1);
}
exit(0);
}
if (write(sock, buf, strlen(buf)) < 0) {
perror("write");
exit(1);
}
}
if (FD_ISSET(sock, &rmask)) {
bytesread = read(sock, buf, sizeof (buf) - 1);
if ( bytesread == 0) {
perror("close connection");
exit(1);
}
buf[bytesread] = '\0';
printf("%s: got %d bytes: %s\n", argv[0], bytesread, buf);
}
}
}
3. 동작 모습



6. 소켓 관련 함수
1. 테스트 코드
1. functest.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <ctype.h>
#include <netinet/tcp.h>
#include <errno.h>
int getsockopttest(int sockfd) {
int optnames[128] = {
SO_ACCEPTCONN, SO_BROADCAST, SO_DEBUG, SO_ERROR, SO_KEEPALIVE,
SO_LINGER, SO_OOBINLINE, SO_RCVBUF, SO_REUSEADDR, SO_REUSEPORT,
SO_SNDBUF, SO_TYPE, SO_PROTOCOL, TCP_NODELAY, SO_DOMAIN,
SO_DONTROUTE, -1
};
int optval = 0;
int i = 0;
socklen_t len = sizeof(optval);
printf("Socket : %d\n", sockfd);
for (i = 0; i < 100; i++) {
if(optnames[i] == -1)
break;
optval = 0;
len = sizeof(optval);
if (getsockopt(sockfd, SOL_SOCKET, optnames[i], &optval, &len) == -1) {
printf("%d: error %d\n", i, errno);
} else {
printf("%d: %d\n", i, optval);
}
}
return 0;
}
int setsockopttest(int sockfd) {
int keepalive = 1;
socklen_t len = sizeof(keepalive);
if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, len) == -1) {
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
int reuse = 1;
len = sizeof(reuse);
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, len) == -1) {
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &reuse, len) == -1) {
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
return 0;
}
int addresstest(struct sockaddr_in *addr) {
int val = 0;
in_addr_t t;
char *ipaddr = "10.4.2.1";
char ipaddr2[100];
struct in_addr inp;
printf("host %s, port %d\n", inet_ntoa(addr->sin_addr), ntohs(addr->sin_port));
val = inet_aton(ipaddr, &inp);
printf("%08x %d\n", ntohl(inp.s_addr), val);
t = inet_addr(ipaddr);
printf("%08X %s\n", t, ipaddr);
t = inet_network(ipaddr);
printf("%08X %s\n", t, ipaddr);
printf("inet_ntoa %s\n", inet_ntoa(inp));
printf("inet_lnaof %08X\n", inet_lnaof(inp));
printf("inet_netof %08X\n", inet_netof(inp));
inp = inet_makeaddr(10, 4 << 16 | 2 << 8 | 2);
printf("inet_makeaddr %s\n", inet_ntoa(inp));
printf("inet_lnaof %08X\n", inet_lnaof(inp));
printf("inet_netof %08X\n", inet_netof(inp));
memset(&inp, 0, sizeof(inp));
inet_pton(AF_INET, ipaddr, &inp);
printf("inet_pton %s %08X \n", ipaddr, inp.s_addr);
}
int main(int argc, char *argv[]) {
struct sockaddr_in server, remote;
int request_sock, new_sock;
int bytesread, addrlen;
int i, ret;
char buf[BUFSIZ];
if (argc != 3) {
(void) fprintf(stderr,"usage: %s IP port\n", argv[0]);
exit(1);
}
if ((request_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror("socket");
exit(1);
}
memset((void *) &server, 0, sizeof (server));
server.sin_family = AF_INET;
inet_aton(argv[1], &server.sin_addr);
server.sin_port = htons((u_short)atoi(argv[2]));
setsockopttest(request_sock);
if (bind(request_sock, (struct sockaddr *)&server, sizeof (server)) < 0) {
perror("bind");
exit(1);
}
if (listen(request_sock, SOMAXCONN) < 0) {
perror("listen");
exit(1);
}
addresstest(&server);
getsockopttest(request_sock);
for (;;) {
addrlen = sizeof(remote);
new_sock = accept(request_sock, (struct sockaddr *)&remote, (socklen_t *)&addrlen);
if (new_sock < 0) {
exit(1);
}
printf("connection from host %s, port %d, socket %d\n",
inet_ntoa(remote.sin_addr), ntohs(remote.sin_port), new_sock);
getsockopttest(request_sock);
getsockopttest(new_sock);
}
}
2. 출력

7. 파이썬을 이용한 소켓 프로그래밍
1. TCP
1. TCP Server
tcpsrv.py
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET,SOCK_STREAM)
serverSocket.bind(('',serverPort))
serverSocket.listen(1)
print ('The server is ready to receive')
while True:
connectionSocket, addr = serverSocket.accept()
print (addr)
sentence = connectionSocket.recv(1024).decode()
print(sentence)
capitalizedSentence = sentence.upper()
connectionSocket.send(capitalizedSentence.encode())
connectionSocket.close()
2. TCP Client
tcpcli.py
from socket import *
serverName = 'localhost'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName,serverPort))
sentence = input('Input lowercase sentence:')
clientSocket.send(sentence.encode())
modifiedSentence = clientSocket.recv(1024)
print ('From Server:', modifiedSentence.decode())
clientSocket.close()
2. UDP
1. UDP Server
udpsrv.py
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print ("The server is ready to receive")
while True:
message, clientAddress = serverSocket.recvfrom(2048)
print(message.decode())
print(clientAddress)
modifiedMessage = message.decode().upper()
serverSocket.sendto(modifiedMessage.encode(), clientAddress)
2. UDP Client
udpcli.py
from socket import *
serverName = 'localhost'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM)
message = input('Input lowercase sentence:')
clientSocket.sendto(message.encode(),(serverName, serverPort))
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print (modifiedMessage.decode())
clientSocket.close()