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
type | protocol | actual protocol |
---|
SOCK_DGRAM | IPPROTO_UDP | UDP |
SOCK_STREAM | IPPROTO_TCP | TCP |
SOCK_RAW(user creates a packet header) | IPPROTO_ICMP | ICMP |
SOCK_RAW(user creates a packet header) | IPPROTO_RAW | RAW |
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