- 프로세스 간 통신을 위해 OS가 제공하는 API
- Application 레이어에서 통신은 Transport Layer에서 제공하는 TCP / UDP 중에서 구현된 소켓을 사용하게된다.
서버
- socket() - socket(int domain, int type, int protocol) 소켓 생성에 성공하면 소켓의 ID가 리턴된다.(file descriptor)
- bind() - socketId를 사용해서 소켓을 특정 address(포트)에 bind한다.
- listen() - socket을 listen 용도로 사용할 것임을 선언. 동시에 몇개까지 처리해준다를 정해줄 수 있다.
- accept() - 클라이언트의 요청을 받을 준비가 됨.
- 클라이언트로 부터 connection이 들어올 때까지 Block된다.
- 연결이 되면 클라이언트의 IP와 포트넘버가 저장된다.
- close() - 사용이 끝난 소켓 release
클라이언트
- socket()
- connect() - bind()는 특정 포트에 연결하는 것인데 클라이언트는 특정 포트가 불필요하므로 bind를 사용하지 않는다.
프로그램이 종료되더라도 socket이 release되지 않을 수 있다. → 프로그램 종료 시 socket release되도록 signal을 주어야한다.
- Multiplexing : sender 측 - 데이터에 header를 붙여서 segment를 구성
- Demultiplexing : receiver 측 - 적절한 데이터를 추출해서 application에서 올려줌
UDP의 Demultiplex
Transport에서 송/수신 포트 정보
Network layer에서 IP 정보
Destination port와 IP만으로 demultiplexing이 일어난다.
TCP의 demux
- Source IP/ Source Port
- Dest IP/ Dest Port
4개 튜플로 찾는다. 소스의 정보가 바뀌어도 다른 곳으로 전달된다.
클라이언트마다 소켓이 다르므로(소켓으로 클라이언트를 식별) UDP 대비 리소스 소모가 크다.
UDP는 Checksum(에러체킹)과 Multi-Demulti 해준다.
오늘의 주제
- 체크섬의 동작 찾아보기.
- Multi, Demulti 찾아보기
- Application Layer에서 패킷이 소켓에 의해 Transport Layer로 전달될 때, 여러 소켓의 패킷을 수집하여 하나의 세그먼트에 캡슐화하여 Network layer로 전달하는 과정
- Transport layer에서 세그먼트가 Application layer로 전달될 때, 올바른 소켓으로 전달하는 과정
- 세그먼트의 헤더정보를 분석해서 대상 소켓으로 데이터를 전달할 수 있다.
- 데이터 그램(Network layer의 패킷)에는 source IP, destination IP 주소를 갖고 있다.
- 세그먼트에는 위 이미지와 같이 source port#, destination port# 를 갖고 있다.
- Source IP, Port와 상관없이 dest의 정보만 같다면 같은 소켓으로 전달된다.
- TCP는 연결 지향으로, 클라이언트마다 다른 소켓을 가지게된다.
- 4-tuple로 socket을 식별하여 전달한다.
- TCP의 체크섬은 16비트의 값으로 계산됩니다.
- 송신 측에서는 전송할 데이터의 모든 16비트 단위로 값을 더한 후, 이진 보수(complement)를 취한 값으로 체크섬을 계산합니다.
- 수신 측에서는 수신된 데이터의 모든 16비트 단위로 값을 더한 후, 송신 측에서 계산한 체크섬과 함께 이진 보수 연산을 수행합니다. 결과 값이 모두 1이면 오류가 없는 것으로 판단하고, 0이면 오류가 있는 것으로 판단합니다.
- 비트합 계산중 carry가 발생될 경우에는 warp around를 적용한다.



