[OSI 7 계층] Transport Layer (2)

nana·2023년 1월 13일
0

네트워크

목록 보기
4/12

TCP(Transmission Control Protocol)

connection-oriented protocol로 virtual connection을 한다.(데이터 전달 전 미리 연결을 해야 한다.)
Flow control과 에러 검출 및 복구를 수행한다.

TCP를 사용하는 Well-known ports

Stream Delivery Service

Sender와 Receiver가 virtual connection을 만들어, 데이터를 전달하여 통신한다.
따라서 TCP를 stream-oriented protocol이라고 한다.

Sending buffer & Receiving buffer

TCP는 Sending buffer와 Receiving buffer를 사용한다. (buffer로 circular queue를 사용)

  • Sending buffer는 데이터를 보낸 후에 receiver가 제대로 받았다는 것이 확인되지 않은 경우, 보냈던 데이터도 저장하여 오류가 발생한 경우에 재전송한다 -> 오류 복구 방법
  • Receiving buffer는 순서대로 읽은 데이터부터 삭제한다. (읽지 않은 데이터들은 대기한다)

Segment

TCP에서 사용하는 헤더 정보가 추가된 데이터 포맷이다.
에러 검출 및 복구 목적으로 각 segment에 헤더 정보를 추가하여 IP layer에 전달한다.
segment의 순서가 뒤바뀌거나, segment가 분실되거나, 손상된 경우에는 재전송한다.

TCP의 송수신 단위는 byte이다 (byte 단위로 전송하고 읽는다)

Full-Duplex : 데이터를 보내면서 받을 수 있다

TCP는 full-duplex service를 제공한다. (두 프로그램이 연결되면 서로 데이터를 전달하고 받을 수 있다)

  • Piggybacking : A가 B로 패킷을 보낼 때, B로부터 패킷을 잘 받았다는 ACK를 붙여서 같이 전달할 수 있다.

Byte numbers

  • segment는 byte의 순서를 담아서 보낸다 (예: 첫 번째 byte가 8001부터 있다)
  • Sequence Number는 byte의 개수를 세는 것이다.
  • Numbering은 랜덤한 숫자부터 시작된다.
  • 숫자 범위 : 0 ~ 2^32 - 1
    (예: random number가 1,057이고 total number가 6,000 bytes이면 bytes는 1,057 ~ 7,056까지이다)

Sequence number

segment가 전달하는 데이터의 첫 번째 바이트의 sequence number를 segment의 sequence number로 지정한다.

Acknowledge number

받은 데이터의 다음 데이터를 요구하는 숫자로 지정한다.(받을 데이터의 시작 byte number)
예) 7,056까지 잘 받았으면 7,057을 acknowledge number로 지정

segment 포맷

Control field

  • 각각은 1bit이며, 0이냐 1이냐에 따라 특수한 의미를 가짐.
  • 연결 시 SYN = 1, 연결 해제 시 FIN = 1로 설정한다.
  • SYN은 sender와 receiver의 sequence number를 동기화하자는 의미이다.
  • ACK는 응답의 의미이다. (1이면 좋다는 의미)
  • RST은 연결을 초기화하자는 것이다. (오류가 났으니, 주고 받은 데이터를 모두 폐기하고 다시 통신하자)

TCP의 연결 설정

TCP는 동시에 송수신이 가능하다.
따라서 아래와 같이 SYN -> ACK + SYN -> ACK를 통해 연결하게 된다. (Simultaneous Open)

참고 ) SYN flooding attack : 메시지 내에서 SYN을 1로 한 후 계속하여 요청을 보내면 서버가 죽을 수 있다

데이터 전송 과정 (에러가 없는 상황)

급하게 보내야할 데이터가 있을 경우에 application에서 push request를 한다. 이 경우에는 TCP가 바로 segment를 만들어서 전송한다. -> Pushing data
데이터 중에 긴급하게 읽혀야 할 데이터가 있는 경우에 URG bit를 1로 하여 전송하면, TCP는 받자마자 순서와 관계 없이 바로 application으로 데이터를 전달한다. -> Urgent data

TCP의 연결 해제

위와 같은 경우에는 서로 데이터 전송이 끝났기 때문에 연결을 해제한다.

Half close

A -> B 데이터 전송은 끝났지만, B -> A 데이터 전송은 끝나지 않은 경우에 B -> A 데이터 전송이 끝날 때까지 연결이 유지될 수 있다.

RWND

  • rwnd : receive window field (receiving buffer의 크기를 저장)
  • Receive window size는 클수록 좋지만, TCP에서 정해놓은 크기보다 크게 잡기 어렵다.
    (참고: TCP 성능 저하의 이유 중 하나는 과거의 저속 통신 시스템을 기반으로 flow control을 하기 때문이다. 따라서 고속 통신 시스템에 맞지 않는 흐름 제어 방식이 존재한다.)
  • TCP에서 socket programming을 할 때 속도를 높이고 싶다면 receive window size를 키울 수 있다.(운영체제 레벨에서 조절 가능)

데이터 전송 과정(ACK)

ACK는 타이머에 따라서 전송한다. (전통적으로 500 =ms마다 전송)

  • 타이머의 장점 : 전송 받을 수 있는 데이터의 양을 주기적으로 업데이트해주어 같은 시간 내에 많은 양의 데이터를 받을 수 있도록 해 준다. 따라서 타이머의 시간이 짧을수록 sender에게 receive window size의 상황이 빠르게 업데이트 되기 때문에 고속 처리가 가능하다.
  • 타이머의 단점 : 타이머의 시간이 짧을수록 ACK 메시지가 많이 전송되어 부하가 증가할 수 있다.

에러 검출

RTO (Retransmission Timeout)

  • 데이터 전송 후 타이머를 켰을 때 시간 내에 응답이 오지 않으면(expired), 데이터를 재전송함.
  • 데이터가 제대로 전송되지 않았음을 ACK로 확인하자마자 다시 재전송하는 것이 아니라, 재전송 타이머가 켜졌을 때 데이터를 재전송한다.

Fast retransmission

TCP의 속도를 개선하기 위해서 고안된 방법으로, 1) 수신단에서는 데이터를 받을 때마다 ACK를 보내고 2) 송신단에서는 동일한 데이터에 대해 ACK를 3회 중복으로 받으면 즉시 데이터를 재전송한다.

(단, ACK의 유실에 따른 재전송은 존재하지 않는다)

TCP의 데이터 전송 방식

sender는 데이터 전송 시 한 번에 receive window를 모두 채울 수 있는 양의 데이터를 보내지 않는다.

  1. 순차적으로 증가시킴(congestion avoidance, additive increase) : 송신단에서 수신단까지 데이터를 전송하는 과정에서 네트워크에 트래픽이 몰릴 경우, 중간에 있는 네트워크 장치들이 수용할 수 있는 데이터의 양을 넘길 수 있다. 따라서 한 번에 보내지 않고 조금씩 조절해서 전송하는 양을 하나 씩 늘리는 방법.

  2. 2의 배수만큼 증가시킴(slow start, exponential increase) : 매 번 보낼 때마다 전송하는 양을 두 배로 늘리는 방법.
    Cwnd : Congestion Window

Taho TCP

전통적인 방법의 TCP

1개부터 시작하여 두 배씩 증가시키다가, 중간에 문제가 발생하면 다시 1개로 개수를 줄인다. ((문제 발생 시점에서 전송한 수) / 2)개까지는 두 배씩 증가시키고, 그 이후부터는 1개씩 증가시키는 방식으로 데이터를 전송한다.

Reno TCP

Taho TCP보다 속도가 더 빠른 TCP으로, Fast retransmission 방식으로 데이터를 전송한다.

Taho TCP와 달리 1개씩 증가하는 구간에서 문제가 발생하더라도 개수를 1로 줄이는 것이 아니라, Fast retransmission을 통해 속도를 올려서 최대한 전송 속도가 떨어지지 않도록 한다. => 평균 전송 속도를 높일 수 있다.

TCP 성능 향상을 위한 방법

  • TCP의 문제점 : 네트워크 상황에 따라 전송 속도가 출렁출렁 거린다.
  • TCP의 성능을 높이기 위해서는 클라이언트 프로그램과 서버 프로그램 사이에 여러 개의 TCP 연결을 만들어 데이터를 나누어 TCP 세션에 동시다발적으로 전송하는 방법을 사용할 수 있다.
    (예: 4개의 TCP 연결을 만들면 3.x배까지 속도를 높일 수 있다)\
    -> HTTP 1.1에서 전통적으로 사용하는 전송 기법
profile
언젠가 개발자

0개의 댓글

관련 채용 정보