[컴퓨터네트워크] 3강 - socket, multiplexing

seo young park·2022년 3월 13일
0
post-thumbnail

💡 해당 포스트는 kocw 이석복 교수님의 컴퓨터 네트워크 강의를 듣고 작성하였습니다.

socket

  • socket의 정의
    서버와 클라이언트이 특정 포트를 통해 양방향 통신 할 수 있도록 만드는 링크 단자.
    각 프로세스는 socket을 통해서 통신을 하게 되며, socket은 ip 주소 및 port 번호 받음.
  • socket의 2가지 타입 : Two essential types of sockets
    socket은 socket stream(aka TCP), socket data gram(aka UDP)로 나뉜다.

socket functions

tcp case

  • TCP server
    • socket(); socket 생성
    • bind(); socket에 포트번호 부여(특정 port에 바인딩)
    • listen(): socket을 수신상태로 둠
    • accept(); 클라이언트로 요청받을 준비완료
  • TCP client
    • socket();
    • connect(); 원격 host와 연결
    • write(); 데이터 송신

function

create->bind->wait for connection->accept

socket 생성 : socket();

int socket(int domain, int type, int protocol);

  • domain : 생성할 socket이 통신을 위해 사용할 프로토콜 체계 설정
  • type : socket이 사용할 데이터 전송타입 설정(tcp || ucp)
  • protocol: 두 호스트 간 통신을 위한 특정 포로토콜 지정

소켓을 생성하는 함수.
두 번째 파라미터가 중요한데, tcp를 할 지 udp를 할 지 방식을 정한다.
리턴 값: 성공 시 파일 디스크립터, 실패 시 -1

파일 디스크립터 : 운영체제가 특정파일에 할당한 정수값

주소정보 할당 : bind();

int bind(int sockfd, struct sockaddr* my addr, int addrlen);

  • sockfd : 주소를 할당할 socket의 디스크립터 번호
  • *addr : 할당하고자 하는 주소 정보(ip, port)를 가지고 있는 serv_addr 구조체
  • addrlen : 주소정보를 담은 변수의 길이

소켓에 포트 번호를 부여하는 함수.
소켓을 특정 프로세스에 bind한다.
리턴 값 : 성공 시 0, 실패 시 -1

연결요청 대기 : listen();

int listen (int sockfd, int backlog);

  • sockfd : client로부터 연결 요청을 받을 socket 디스크립터 번호 (서버소켓)
  • backlog: 연결요청을 대기하는 큐의 크기

소켓에 연결요청을 대기하는 함수.
두 번째 파라미터를 통해 backlog queue size를 지정하고 size만큼 que 공간을 갖는다. 모든 연결 요청은 que에 들어가 순서대로 수락을 기다린다.
리턴 값: 성공 시 0, 실패 시 -1

listen 함수가 호출된 이후에 client에서 connect를 호출할 수 있다.

연결요청 수락 : accept();

int accept(int sockfd, struct sockaddr* cliaddr, int* addrelent)

  • sockfd : 연결을 기다리는 서버 socket 디스크립터 번호
  • addr : 연결 요청을 수락할 클라이언트의 ip와 port 정보
  • addrlen : addr 변수의 크기

client의 연결 요청을 받아들이는 함수.
accept 함수의 반환값은 성공/실패에 대한 결과정수값이 아니라 새로운 디스크립터 번호다.
리턴 값: 성공 시 새로 생긴 파일 디스크립터, 실패 시 -1

연결요청 : connect ();

int connect(int sockfc, struct sockaddr *serv_addr, int addrlen)

  • sockfd : client 디스크립트 번호
  • addr : 연결 요청을 보낼 서버 주소 정보를 지닌 구조체
  • addrlen : addr 변수의 크기

클라이언트에서 서버로 연결을 요청하는 함수
리턴 : 연결요청이 서버에 의해 수락되거나 오류가 발생해서 요청이 중단되면 connect 함수가 리턴됨.
블로킹 : 서버 대기 큐에서 대기하는 상태면 리턴되지않고 블로킹.
리턴 값: 성공 시 0, 실패 시 1

소켓 종료 : close();

데이터 송수신 후, 소켓을 완전히 소멸시키고 연결을 닫는 함수.

multiplexing

transport layer는 출발지부터 도착지까지 패킷이 제대로 전송될 수 있도록 한다.

multiplexing

application layer에서 packet이 socket을 통해 transport layer로 전달될 때, 패킷을 수집해 하나의 segment로 캡슐화하여 network layer로 전달

demultiplexing

하위레이어로부터 수신된 segment(data + header)를 올바른 socket(app)으로 전송하는 것.
이 때 segment header 정보(destination port)를 보고 올바른 socket으로 전달한다.

udp demultiplexing : connectionless demux

udp는 dest ip, dest port 2개로 판단한다.
source ip,port 가 달라도 destination port가 같으면 같은 소켓으로 전달된다. 출처는 고려하지 않는다.

tcp demultiplexing : connecntion-oriented demux

tcp socekt은
source ip / source port /
destination ip / destination port
4-tuple로 식별한다.
웹 서버는 각 연결된 클라이언트마다 서로 다른 socket을 가진다. 자원이 많이 소모된다.

transport layer는 segment에 port저장하고
network layer는 packet에 ip저장한다.

udp segment header

udp,tcp,ip 프로토콜 header가 중요하며, header를 알아야 프로토콜을 이해할 수 있다.

udp header field 4개이며, 한 필드 16bit를 차지한다.

  • length : 데이터 길이
  • checksum : 데이터 전송 도중 에러 발생 여부 체크
    데이터가 에러가 생겼으면 올리지 않고 drop한다.

udp가 아무일도 안하는 것 같지만 multiplexing, de-multiplexting, error checking 등 기본적인 3가지 기능은 제공한다.

출처1
출처2
출처3
출처4

0개의 댓글