네트워크 프로그래밍02 소켓의 타입과 프로토콜의 설정

zh025700·2022년 3월 30일
0

네트워크 프로그래밍

2. 소켓의 타입과 프로토콜의 설정

대화를하기 위해선 방법이 있어야한다.
방법이 프로토콜이다

프로토콜이란

대화에 필요한 통신 규약

컴퓨터 관점 => 컴퓨터 상호간의 대화에 필요한 통신규약

소켓 생성

다음 함수 실행

 int socket(int 프로토콜 체계, int 데이터 전송방식, int 프로토콜 정보)

실행에 성공하면 리턴값으로 파일 디스크립터 값을 주고 실패하면 -1을 준다

  • 프로토콜 체계?

    • PF_INET = IPv4 체계, 보통 이거 많이쓴다! == AF_INET(주소 체계)
    • PF_INET6 = IPv6 체계
  • 소켓의 타입

    • SOCK_STREAM, SOCK_DGRAM
    • 소켓의 데이터 전송 방식
    • 프로토콜 체계와 데이터 전송방식은 별개다.
    • 대표적 두개의 전송 방식이 있다.

소켓 생성은 어디에 데이터를 송수신할지를 나타내는게 아니다!!
단지 인터페이스만 생성!!

연결지향형(SOCK_STREAM)

  • TCP

  • reliable

  • 중간에 데이터가 소멸되지 않고 전송됨

  • 전송 순서대로 데이터가 수신됨

  • 데이터의 경계가 존재하지 않음

    • read와 write의 횟수가 달라도 된다를 의미
  • 1대1 통신

        소켓의 내부 버퍼에 데이터를 저장한다.
        그래서 전송이 되었다고 바로 함수를 호출해야하는 것은 아니다.
    
        버퍼의 용량을 초과하지 않는 한 데이터를 읽거나 보낼 수 있다.
    
        함수 호출의 횟수는 의미가 크게 없다. 그래서 데이터의 경계가 없다고 한다
    
      그렇다면 수신 버퍼가 꽉 차면 데이터가 손실이 되나?
      => 소켓이 데이터를 전송(송신)하지 않으므로 손실이 안됨.

즉 신뢰성있는 순차적인 연결 지향 데이터 전송 방식이다.

비 연결지향형(SOCK_DGRAM)

  • UDP
  • unreliable
  • 순서에 상관없는 빠른 전송
  • 데이터의 파손 가능성
  • 전송 데이터의 경계가 존재
    • 전송할 때 두번 함수를 호출했다면 수신도 두번 함수 호출이 되어야한다.
  • 한번에 전송할 수 있는 데이터의 크기가 제한됨

신뢰성과 순차적 데이터 전송을 보장 안하는 빠른 데이터 전송을 목적으로하는 방식

프로토콜 정보

대부분의 경우 0을 넣어줘도 원하는 소켓을 생성할 수 있다.

  단, 하나의 프로토콜 체계안에 데이터 전송방식이 동일한 프로토콜이 두개 이상 존재하는 경우

  즉 소켓의 데이터 전송방식은 같지만, 프로토콜이 나뉘는 경우에는 세번째 인자를 통해 정보를 구체화 해야한다.

Connection Setup

TCP에서만 필요하고 UDP는 필요없다.

  • 연결은 클라이언트, 서버에서 일어난다

    • Passive(server): 연결을 기다린다
    • Active(client): 연결을 한다!
  • 연결이 일어나면 passive active 둘다 하는 역할이 비슷하다

    • 입출력
    • 통신 종료

TCP 이론

TCP의 이론이다

TCP 소켓의 입출력 버퍼

TCP의 데이터 송수신에는 경계가 없다고 했다.
그래서 40바이트를 전송하면 10바이트씩 읽어오는 것이 가능하다

먼저 10 바이트만 수신한다면 나머지 30바이트는 어디에 있는가??

  • 버퍼에 존재한다

    입출력 함수가 호출되는 순간 바로 데이터가 전송되지 않는다.
    데이터들은 먼저 버퍼에 들어간다!!

  • write 함수의 데이터는 출력버퍼로 => 상대방의 입력버퍼로

  • read 함수의 데이터는 입력버퍼로 => 상대방의 출력버퍼로

    write함수를 통해 출력 버퍼에 전달된 데이터를 상대방의 입력버퍼로 전송한다.
  • 입출력 버퍼는 TCP 소켓에 각각 별도로 존재

  • 입출력버퍼는 소켓 생성시 자동으로 생성됨

  • 소켓을 닫아도 출력버퍼에 남아있는 데이터는 전송이 된다

  • 소켓을 닫으면 입력버퍼에 있는 데이터는 소멸된다

그럼 만약 버퍼 크기보다 큰 데이터를 전송할려면??

  • 허용되지 않음
  • 슬라이딩 윈도우 프로토콜이 이를 조절함!

write 함수가 반환되는 시점은 데이터가 출력버퍼로 이동되었을 때!!

TCP 상대 소켓과의 연결 내부 동작(flow control)

TCP 소켓은 3-way handshaking으로 연결이 된다.

  • 3-way handshaking

    • TCP 소켓은 연결과정에서 3번의 과정을 거친다.

-과정-

A: 연결 요청을 한다.

  1. A가 B에 SYN을 보낸다
    • SEQ: 1000 ACK: -
  2. B가 A에 SYN+ACK를 보낸다
    • SEQ: 2000 ACK: 1001
  3. A가 B에 ACK를 보낸다
    • SEQ:1001 ACK:2001
  • SYN: 처음 연결 요청에 사용되는 메시지(동기화 메시지)
  • SYN+ACK: 동기화 메시지(SYN) + 응답메시지(ACK)
  1. SEQ 뜻:현재 보내는 패킷에 1000이라는 번호를 부여, 확인되면 다음엔 1001번 패킷을 전달하라고 나(A)에게 알려라.
  2. SEQ 뜻: 현재 보내는 패킷에 2000을 부여하니 받았다면 다음에 2001을 보내라고 나(B)에 말해라
    ACK 뜻:전에 전송한 SEQ가 1000인 패킷을 잘 받았으니 다음에는 SEQ가 1001인 패킷을 전송해라!
  3. 전에 전송한 SEQ가 2000인 패킷을 받았으니 다음엔 SEQ가 2001인 패킷을 전송해라

이를 통해 A B 상호간에 데이터 송수신을 위한 준비가 되었다
이렇게 패킷에 번호를 붙여서 TCP는 reliable하다! 손실이 없다

TCP 상대 소켓과의 데이터 송수신 내부 동작(flow control)

  1. 100 바이트를 전송한다 SEQ: 1200 A->B
  2. ACK 1301을 전송 B->A
  3. 100 바이트를 전송 SEQ: 1301 A->B
  4. ACK 1402를 전송
  • 호스트가 100바이트를 전송했기 때문에 ACK에 1200+ 100+ 1인 1301를 주었다.
    • 전송된 바이트의 크기를 추가로 증가시킨다 데이터가 잘 전송 되었는지 확인할 방법!

ACK 메세지는 = SEQ 번호 + 전송된 바이트 크기 + 1

1을 더하는 이유는 다음 전달될 SEQ 번호를 알리기 위해서

만약 패킷이 소멸된다면??

  • 일정한 시간이 지난 후 다시 패킷을 보냄

TCP 상대 소켓과의 데이터 송수신 연결 종료(flow control)

  • 4-way handshaking을 통한 종료
  1. FIN SEQ:5000 ACK: - A->B
  2. ACK SEQ:7500 ACK:5001 B->A
  3. FIN SEQ:7501 ACK:5001 B->A
  4. ACK SEQ:5001 SEQ:7502 A->B
  • FIN은 종료를 알리는 메시지
    • 상호간에 FIN을 주고받아야 연결이 종료된다.
  • ACK 5001이 두번 호출된 이유: 응답이 없어서!!
profile
정리

0개의 댓글