1.사용자계층 네트워크 애플리케이션 종류
발표자: 박광수
Socket 이란?
네트워크 소켓, 인터넷 소켓 : 네트워크로 연결되어 있는 통신 접점에 위치한 통신 객체
OS의 API의 일종 : 프로세스 간의 통신을 위하여 제공되는 API.
7 Layers
transport layer → TCP / UDP 소켓을 지원
TCP는 신뢰할 수 는 통신
UDP는 몇가지 신뢰도는 포기하되 좀더 직접적인 통신
스트림 소켓
양뱡향으로 바이트 스트림을 전송할 수 있는 연결 지향형 소켓
양쪽 어플리케이션이 모두 데이터를 주고받을 수 있음
오류수정 , 정송처리 , 흐름제어등을 보장, 송신된 순서에 따른 중복되지 않은 데이터를 수신
각 메시지를 보내기 위해 별도의 연결을 맺는 행위를 하므로 약간의 오버헤드가 존재
대량의 데이터를 보내는 경우에 적당
통신을 수행하기 위해서 TCP를 사용
데이터그램
명시적으로 연결을 맺지 않으므로 비 연결형 소켓이라 함
메시지는 대상 소켓으로 전송되며 대상 소켓은 메시지를 적절히 수신
데이터그램 소켓을 사용하려면 클라이언트에서 서버로 데이터를 전송할 때 UDP를 사용
UDP-메시지의 크기에 약간의 제한, 메시지의 확실한 전달 역시 보장하지 않으며 통신 중 데이터를 잃어버려도 오류가 발생하지 않음.
TCP Socket

클라이언트 소켓 프로그래밍(Client Socket Programming)
(C)클라이언트 소켓은 처음 소켓을 **생성(create)**한 다음, 서버 측에 **연결(connect)**을 요청
(S)서버가 사용할 IP주소와 포트 번호를 생성해 소켓에 결합(bind)
(S)클라이언트로부터 연결 요청이 수신되는 지 주시(listen)
(S)요청이 수신되면 요청을 받아들어(accept) 데이터 통신을 위한 새로운 소켓을 생성
(S/C)데이터를 송수신(send/recv)
(S/C)송수신이 완료되면 소켓을 닫음(close)
서버 소켓 프로그래밍(Server Socket Programming)
서버 소켓 생성 socket() → 서버 소켓 바인딩 bind() → 클라이언트 연결 요청 대기 listen() → 클라이언트 연결 수립 accept() →데이터 송수신 send() / recv() →소켓 연결 종료 close()
Function
socket (int domain, int type, int protocol); :
소켓을 생성
→ int domain
PF_INET : IPv4 인터넷 프로토콜
PF_INET6 : IPv6 인터넷 프로토콜
PF_LOCAL : Local 통신을 위한 UNIX 프로토콜
PF_PACKET : Low level socket을 위한 인터페이스
PF_IPX : IPX 노벨 프로토콜
→ int type
SOCK_STREAM : 인터넷 기반 연결 지향 소켓(TCP 소켓)
SOCK_DGRAM : 인터넷 기반 비연결 지향 소켓(UDP 소켓)
→ int protocol
IPPROTO_TCP : TCP를 기반으로 하는 소켓을 생성
IPPROTO_UDP : UDP를 기반으로 하는 소켓을 생성
return : socket 의 ID 값
bind(int sockfd, struct sockaddr *myaddr, int addlen);
해당 포트를 특정 주소에 바인딩
→ sockfd : 주소를 할당하고자 하는 소켓의 파일 디스크립터를 인자로 전달한다.
bind의 사용되는 파라미터는 포트 번호 혹은 IP 주소 + 포트 번호
→ myaddr : 할당하고자 하는 주소 정보를 지니고 있는 sockaddr_in 구조체 변수의 포인터를 인자로 전달
→ addrlen : 인자로 전달되느 주소 정보 구조체의 길이를 전달한다.
listen (int sockfd, int backlog);
→ sockfd :연결 요청 대기 상태'에서 클라이언트의 연결 요청을 받아들이는 역할을 하게 될 소켓의 파일 디스크립터를 인자로 전달 하게 된다. 이 소켓을 서버 소켓이라 한다
→ backlog :'연결 요청 대기 큐(Queue)'의 크기를 나타낸다. 인자로 5가 들어오면, 큐의 크기가 5가 되어 클라이언트의 연결 요청을 5개까지 대기시킬 수 있게 된다.
accept(int sockfd, struct socketaddr*myaddr, int addrlen);
→ 서버 측에서 클라이언트의 연결을 수락
→ 클라이언트 주소를 설정한 뒤에 통신에 사용 할 클라이언트의 소켓을 반환
connect(int sockfd, struct socketaddr*myaddr, int addrlen);
→ IP주소와 포트 번호로 식별되는 대상으로 연결 요청
→ 연결 요청에 대한 결과가 결정되기 전에는 connect()의 실행이 끝나지않고 대기
read(int sockfd, char* buf, size_t nbytes);
write(int sockfd, char* buf, size_t nbytes);
close(int soctfd);
→ 열린 소켓을 닫는다.
UDP Socket

UDP 프로토콜 구조

Source Port (16 bits) : 출발지(송신) 포트 번호
Destination Port (16 bits) : 목적지(수신) 포트 번호
Total Length (16 bits) : 헤더와 데이터부를 포함한 전체 길이
Checksum (16 bits) : 전체 데이터그램에 대한 오류를 검사하기 위한 필드
Multiplexing and Demultiplexing

Multiplexing
Application layer 에서 패킷이 소켓에 의해 Transport layer 로 전달 될 때, 여러 소켓의 패킷을 수집하여 하나의 세그먼트에 캡슐화하여 Network layer로 전달하는 과정
Demultiplexing
Transport layer 에서 세그먼트가 Application layer 로 전달 될 때, 올바른 소켓으로 전달 하는 과정
Demultiplexing의 동작

데이터 그램(Network layer의 패킷)에는 source IP, destination IP 주소를 갖고 있음.
데이터 그램은 하나의 세그먼트(Transport layer의 패킷)을 포함.
세그먼트에는 위 이미지와 같이 source port#, destination port# 를 갖고 있음.
→ host는 IP address & port numbers 를 통해 세그먼트를 적절한 소켓에 전송.
• 비연결형 demultiplexing 으로 UDP 에서 발생한다.

연결형 demultiplexing 으로 TCP 에서 발생한다.

3way handshake
[ 네트워크 쉽게 이해하기 22편 ] TCP 3 Way-Handshake & 4 Way-Handshake
1 → 2 받음 / 2 → 1 받음 요청정보 / 1 → 2
Last updated