시스템 프로그래밍(14)

조권휘·2022년 8월 31일
0

시스템 프로그래밍

목록 보기
14/14

Socket Communications(end-to-end)

TCP

  • Binding : socket과 IP/Port의 연결 과정
  • 모든 packet의 전송은 동일한 링크를 통해 전송한다.
  • 안정적이고 흐름 제어에 유용하며 error control이 용이하다.

UDP

  • transmission을 할 때마다 IP/Port를 지정해야한다.
  • simple message를 전달하거나 1회용에 유용하다.
  • message 순서가 뒤집힐 수 있다.
  • message size는 UDP pocket size보다 작거나 같아야한다.
  • overhead가 적지만 흐름 제어가 없고 error control이 용이하지 않다.

Port

  • 네트워크 서비스나 특정 프로세스를 식별하는 논리 단위이다.
  • IP 주소와 port #는 항상 함께 부여된다.
  • port number는 16bit의 정수로 0~65535가 할당된다.
  • 0 ~ 1023 : well-known ports / network 서비스에 이미 할당된 포트 번호
  • 1024 ~ 49151 : registered ports
  • 49152 ~ 65535 : dynamic ports / user free

TCP/UDP Communications

TCP

  • 3-ways : accept()/connect() 과정과 close() 과정에서 server와 client는 질문/답변을 3번 진행한 후 진행한다. 이러한 과정이 가장 확실하고 안정적이기 때문이다.

UDP


Socket Address Structure

#include <sys/socket.h>

struct sockaddr{
	u_char sa_len;
	u_char sa_family; 
	char sa_data[14];
};
  • sa_len : address structure length
  • sa_family : address type
  • sa_data : 14 byte-address

Internet Socket Address Structure

#include <netinet/in.h>
#include <sys/types.h>

struct sockaddr_in{
	u_char sin_len;
	u_char sin_family; 
	u_short sin_port;
	struct in_addr sin_addr;
	char sin_zero[8];
};

struct in_addr
{
	u_long s_addr;
}
  • sin_len : address structure length
  • sin_family : address type
    • AF_INET : internet IP address
    • AF_UNIX : UNIX or used for local communications
    • AF_NS : XEROX network address
  • sin_port : 16 bit port #
  • in_addr : 32 bit IP address
  • s_addr : 32 bit IP address

Socket()

#include <sys/socket.h>
#include <sys/types.h>

int socket (intdomain, inttype, intprotocol);
  • domain : address types
    • PF_INET : internet protoco
    • PF_INET6 : IPv6 protocol
    • PF_UNIX : UNIX, local communications
    • PF_NS : XEROX : Xerox network address
    • PF_IMPLINK : IMP link layer address
  • type : socket type
  • protocol : 사용하려는 protocol
  • return : 성공 시 socket id / 실패 시 -1
typeprotocolactual protocol
SOCK_DGRAMIPPROTO_UDPUDP
SOCK_STREAMIPPROTO_TCPTCP
SOCK_RAW(user creates a packet header)IPPROTO_ICMPICMP
SOCK_RAW(user creates a packet header)IPPROTO_RAWRAW

bind()

#include <sys/socket.h>
#include <sys/types.h>

int bind (int sockfd, struct sockaddr *myaddr, int addrlen);
  • 자신의 host IP addr, port#을 socket에 연결하는 함수
  • sockfd : socket descriptor(file descriptor)
  • myaddr : socket address structure의 address
  • addrlen : "myaddr" structure의 size
  • return : 성공 시 0 / 실패 시 -1

Connect()

#include <sys/socket.h>
#include <sys/types.h>

int connect (int sockfd, struct sockaddr *servaddr, int addrlen);
  • client가 server에서 보내는 connection request message를 대기하는 함수로 message가 오면 connect를 해준다.
  • sockfd : socket descriptor
  • serveraddr : socket addr structure(server의 IP/port#을 보유하고 있는 구조체)
  • addrlen : servaddr structure의 size
  • return : 성공 시 0 / 실패 시 -1

listen()

#include <sys/socket.h>
#include <sys/types.h>

int listen (int socket, int queuesize);
  • socket : socket descriptor 범위
  • queuesize : client connection 요청의 max number
  • return : 성공 시 0 / 실패 시 -1

accept()

#include <sys/socket.h>
#include <sys/types.h>

int accept (int sockfd, struct sockaddr *peer, int *addrlen);
  • server가 client로부터 connection 요청을 기다리고, 수령하는 함수
  • sockfd : socket descriptor
  • peer : socket addr structure(client의 IP/port#을 보유하고 있는 구조체)
  • addrlen : peer structure의 size
  • return : 성공 시 communication을 하기 위한 new client socket descriptor

send() - TCP

#include <sys/socket.h>
#include <sys/types.h>

int send (int sockfd, char *buf, int bytes, int flag);
  • sockfd : socket descriptor
  • buf : 보낼 data를 저장한 buffer
  • bytes : buffer의 크기
  • flag : options
    • MSG_OOB : Out Of Bount data로 긴급한 data를 보낼 때 사용
    • MSG_PEEK : buffer에 data를 유지할 때 사용
    • MSG_DONTROUTE : routing을 ignore할 때 사용
  • return : 성공 시 보낸 data의 size / 실패 시 -1

receive() - TCP

#include <sys/socket.h>
#include <sys/types.h>

int recv(int sockfd, char *buf, int bytes, int flag);
  • sockfd : socket descriptor
  • buf : 받은 data를 저장한 buffer
  • bytes : buffer의 크기
  • flag : options (대부분 NULL)
  • return : 성공 시 받은 data의 size / 실패 시 -1

sendto() - UDP

#include <sys/socket.h>
#include <sys/types.h>

int sendto(int sockfd, char *buf, int bytes, int flag, struct sockaddr *to, int addrlen);
  • sockfd : socket descriptor
  • buf : 보낼 data를 저장한 buffer
  • bytes : buffer의 크기
  • flag : options
  • to : 수신자의 IP주소와 port#을 담고 있는 structure의 주소
  • addrlen : to structure의 크기
  • return : 성공 시 보낸 data의 size / 실패 시 -1

recvfrom() - UDP

#include <sys/socket.h>
#include <sys/types.h>

int recvfrom(int sockfd, char *buf, int bytes, int flag, struct sockaddr *from, int *addrlen);
  • sockfd : socket descriptor
  • buf : 받은 data를 저장한 buffer
  • bytes : buffer의 크기
  • flag : options
  • from : 송신자의 address structure
  • addrlen : from structure의 크기
  • return : 성공 시 받은 data의 size / 실패 시 -1

close()

#include <unistd.h>

int close (int sockfd);
  • sockfd : socket descriptor
  • return : 성공 시 0 / 실패 시 -1
profile
안녕하세요 :) Data/AI 공부 중인 한국외대 컴퓨터공학부 조권휘입니다.

0개의 댓글