[Transport Layer] TCP

임태영·2022년 3월 28일
0

네트워크

목록 보기
6/6

TCP는 전송 계층에서 지원하는 프로토콜 중 하나이다.
프로세스간에 안정적인 데이터 전달을 최대한 보장한다.
그 외에 네트워크 혼잡 제어, 흐름 제어를 지원한다.

용어

먼저 TCP를 이해하기 위해 TCP에서 사용하는 용어를 알아야 한다.

  • checksum

    받은 데이터가 변경이 일어났는지 체크하는 항목이다.

  • Acknowledgement

    TCP는 안정적인 데이터 전달을 지원한다.
    이를 위해 받은 메시지에 대하여 응답을 한다. 응답은 다음과 같다.
    '이전 메시지 까지는 잘 받았고, 이제는 몇 번째를 줄 차례야'
    이와 같은 응답을 Acknowledgement라 한다.

  • Timer

    TCP는 Timer의 시간을 정하여 ack이 도착하지 않으면 재전송을 한다.

  • Window

    TCP는 안정적인 데이터 전달을 위해 ack을 받은 후, 다음 메시지를 전송한다.
    그러나 이와 같이 하게 되면, 전체 네트워크에서 메시지 1개만 돌아다닌다.
    이는 네트워크를 최대한 활용하지 못하는 것이다.
    Window는 네트워크를 최대한 활용하기 위해,
    ack을 받지 않은 메시지를 얼마나 보내도 되는지를 나타낸다.

  • Pipelining

    TCP는 남아있는 window 사이즈 만큼 메시지를 계속 밀어 넣는다.
    이를 Pipelining이라 한다.

  • Sequence number

    TCP는 메시지의 순서를 보장한다.
    이를 위해 각 세그먼트마다 Sequence number를 체크한다.
    Sequence number는 임의의 수로 시작하여, 데이터 크기만큼 점프한다.
    예를 들어 이번에 들어온 데이터가 20바이트이고, seq number가 100이라면,
    다음 seq number는 120이 된다.

TCP Segment

TCP는 프로세스 간에 안정적인 데이터 전달을 최대한 보장한다.
또한 데이터의 순서를 유지해서 받는다.
이를 위해 응용 계층에서 내려온 메시지에 헤더를 추가하여 세그먼트를 만든다.
그리고 이 헤더에 많은 정보를 추가한다.

  • source port # : 메시지는 보내는 프로세스의 포트번호이다.

  • dest port # : 메시지를 받는 프로세스의 포트번호이다.

  • sequence number : 세그먼트의 데이터가 몇번째인지를 나타낸다.

  • acknowledgement number : 받은 메시지에 대한 응답을 나타낸다.

  • head len : TCP헤더는 가변길이다. 따라서 헤더의 길이를 나타내야 한다.

  • U : Urgent data인지를 나타낸다. 일반적으로 사용하지 않는다.

  • A : acknowledgement number가 유효한지를 나타낸다.

  • P : 데이터를 즉시 전송하기 위한 표기다. 일반적으로 사용하지 않는다.

  • S : connection을 맺기 위해 표시한다.

  • F : connection을 종료하기 위해 표시한다.

  • receive window : 받는 측에서 받아들일 수 있는 양을 나타낸다.

  • checksum : 전송 과정에서 발생한 오류가 있는지 체크한다.

  • Urg data pointer : Urgent data의 위치를 나타낸다.

connection 맺기 (3 way handshake)

TCP는 안정적인 데이터 전달을 위해 처음에 connection을 맺는다.
이를 위해 3방향의 handshake을 한다.

사람의 경우 2방향의 handshake을 한다.
A : 뭐 좀 물어봐도 될까요?
B : 네 그러세요.
이렇게 하면 두 사람은 당분간 서로를 인지하게 된다.

그러나 프로세스의 경우에는 2방향 handshake을 하게 되면,
안되는 경우가 존재한다.

만약 클라이언트가 서버측에 connection을 요청하고 응답을 받기까지 정해진 시간을 넘게되면,
클라이언트는 다시 요청을 하게 된다.
그런데 이 요청이 네트워크를 돌고 돌아 늦게 도착할 수도 있다.
심지어 connection을 해제한 이후에 도착하게 된다면,
서버는 존재하지 않는 클라이언트와 connection을 맺게 된다.

따라서 프로세스간에는 3 way handshake를 한다.

  1. 먼저 클라이언트가 서버에 connection을 요청한다.
  2. 서버는 1번 요청에 대한 ack을 보낸다. (client establish)
  3. 클라이언트는 2번 요청에 대한 ack을 보낸다. (server establish)

이렇게 하게 되면 클라이언트와 서버는 안전하게 connection을 맺을 수 있다.

connection 동안 메시지 주고 받기

connection을 맺은 후 클라이언트와 서버는 메시지를 주고 받는다.
seq num, ack을 이용해 안정적인 전송 및 순서 유지를 보장한다.
처음 connection을 맺을 때 클라이언트와 서버는 서로의 seq num를 알린다.
각자의 seq num는 임의의 수다. 0부터 시작한다는 보장이 없다.

보내는 쪽이 seq num x를 보내면, 받는 쪽은 x + 1을 ack으로 응답한다.

이 경우는 보내는 데이터가 없기 때문에 다음이 x+1이다.
만약 보내는 데이터가 있다면, ack은 'x + 데이터의 크기'가 된다.

이는 'x까지는 잘 받았고, x+1을 보내줄 차례야' 라는 뜻이다.

만약 정해진 시간동안 ack을 받지 못한다면, 보내는 쪽에서는 재전송을 하게 된다.
이 때문에 TCP를 사용하면 안정적인 데이터 전달을 최대한 보장한다는 뜻이다.

또 순서에 맞지 않게 메시지를 받은 경우 받는 쪽에서는 즉시 ack을 보낸다.
이 때문에 TCP를 사용하면 메시지의 순서를 유지할 수 있다.

connection 해제 (4 way handshake)

connection 해제는 4방향으로 이루어진다.

  1. 먼저 클라이언트 측에서 Finbit을 1로 하여 connection 해제를 요청한다.
  2. 서버는 ack을 보낸 후 마저 보낼 데이터를 다 보낸다.
  3. 서버는 Finbit을 1로 하여 데이터를 다 보냈음을 알린다.
  4. 클라이언트는 ack을 보낸다. (server close)
    클라이언트는 일정 시간 대기 후 close한다. (client close)
    만약 ack이 서버에 도착하지 않아 3번의 요청이 다시 들어온 경우를 대비하기 위함이다.

flow controll

TCP 세그먼트 헤더에는 receive window 필드가 있다.
receive window 란 전송 계층에 올라온 메시지를 응용 계층에 올려보내기 전에 버퍼에 보관하는데,
이 버퍼의 남은 용량을 나타낸다. 만약 receive window가 0이라면 sender측은 더이상 메시지를 보내지 않는다.
이렇게 하여 버퍼가 넘치는 것을 방지한다.

congestion controll

TCP는 네트워크의 혼잡도를 판단하여 이를 제어한다.
네트워크가 혼잡한지 판단하는 기준은 ack의 도착여부다.

초기에 cwnd는 1 MSS이다.

cwnd는 congestion window로 sender가 메시지를 얼마나 내보낼 수 있는지를 나타낸다.
MSS는 Maximun Segment Size로 Segment의 최대 용량이다.
초기에 sender는 많아야 1개의 최대 사이즈 segment를 내보낼 수 있다.

ack이 도착하면 각 ack에 대하여 cwnd를 1 증가시킨다.
그러면 cwnd는 2 MSS가 된다.

또 ack이 도착하면 각 ack에 대하여 cwnd를 1 증가시킨다.
이제는 cwnd가 4 MSS가 된다.

이렇게 cwnd가 ssthresh에 도달할때까지 2배씩 증가시킨다.

ssthresh란 threshold value of cwnd to Slow down Speed of increment로
cwnd의 증가속도를 줄여야 하는 지점을 말한다.
ssthresh는 운영체제에 의해 초기값이 정해진다.

ssthresh에 도달하면 이제는 cwnd를 1씩 증가시킨다.
그러다 만약 ack이 도착하지 않으면,
ssthresh를 cwnd/2로 줄이고,
cwnd도 반으로 줄인다.

이렇게 TCP는 조금씩 증가시키고 크게 감소시키는(additive increase multiplicative decrease) 방식으로
네트워크의 혼잡을 제어한다.

참고
컴퓨터 네트워크 - 이화여대 이미정 교수님
Computer Networking: A Top-Down Approach 6th ed. J.F. Kurose and K.W. Ross

profile
나 스스로를 깊게 알고싶은 사람입니다.

0개의 댓글