본 내용은 Computer networking : a top-down approach 책을 바탕으로 정리하였습니다.
Index
- 1. TCP Overview : segment structure
- 2. reliable data transfer
- 3. flow control
- 4. connection management
1. TCP Overview : segment structure
트랜스포트에서의 TCP를 설명하기에 앞서,
TCP에 대해 다시 한번 복습할 겸 신뢰 기반의 전송에서의 TCP의 특성을 짚고 넘어가려 한다.
1.1 TCP 특징
- point-to-point : 송신자, 수신자가 서로 1대 1로 데이터를 주고받는다.
- 신뢰적이며, 데이터가 큰 파일을 byte stream으로 나누어 보낸다.
- 파이프라인화 되어있다.
- 양방향 연결 서비스를 제공한다.
- 혼잡 제어, 흐름 제어 기능을 가지고 있다.
- 3-way 핸드 셰이크를 사용해 연결 지향적이다.
1.2 TCP segment structure
src, dst 포트 번호와 데이터 길이, 체크섬, 데이터만 가지고 있는 UDP 헤더와 다르게
위 그림에서 보다시피 상당히 많은 것들이 TCP 헤더에 담겨 있다.
특성을 간단히 설명하자면
- 연결 지향으로 sequence num, ack num들이 무려 32비트를 차지한다.
- head len에는 헤더만의 길이만 저장한다.
- U, A, P, R, S, F는 헤더를 표시한다.
1.3 Dividing file data into TCP segments
밑에 window 그림의 직사각형 하나하나가 segment를 의미하고, 세그먼트는 트랜스포트 레이어의 PDU(protocol data unit)이다.
위 그림에서 0 ~ 999, 1000 ~ 1999 등이 하나의 세그먼트 데이터를 의미하며 해당 시퀀스 넘버는 1,000씩 증가한다.
1.4 TCP의 시퀀스, ack 넘버
1) 시퀀스 넘버 : 첫 번째 세그먼트의 바이트 넘버를 의미한다.
2) ack 넘버 : 다음으로 받고자 하는 시퀀스 넘버를 의미하고, 이는 누적 ack이다.
위 그림처럼 각각 호스트 A, B가 tcp 전송을 하고, 양방향으로 둘 다 sender와 receiver의 역할을 한다.
A가 시퀀스 42, ACK 79를 보내면, B는 그에 대한 응답으로 시퀀스 79와 ack 43을 요청한다.
2. 신뢰적인 데이터 전달
TCP는 IP의 비신뢰적인 'best-effort' 서비스에서 신뢰적인 데이터 전달 서비스를 제공한다.
TCP의 신뢰적인 데이터 전달 서비스는 프로세스가 자신의 수신 버퍼로부터 읽은 데이터 스트림이
손상되지 않았으며 손실이나 중복이 없다는 것과 순서가 유지된다는 것을 보장한다.
2.1 TCP sender events
TCP 송신자의 이벤트는 여러 종류가 있다.
- 시퀀스 넘버와 함께 세그먼트를 만든다.
- 시퀀스 넘버는 첫 번째 데이터 바이트의 바이트 스트림 넘버이다.
- 가장 오래된 세그먼트에 대해 타이머를 작동시킨다.(아직 ack 받지 못한 세그먼트 중)
- 앞의 ack가 도착 시 ack를 업데이트한다.
위 그림은 TCP sender의 FSM이다.
순서를 설명하자면
- 1. 시퀀스 넘버, sendbase를 초기화한다. (둘 다 동일)
- 2. 이벤트에 대해 기다린다.
- 3. 애플리케이션 계층에서 데이터를 수신받으면, 세그먼트(+시퀀스 넘버)를 생성 후 다음 시퀀스 넘버를 만들고, 타이머를 시작한다.
- 4. if timeout : 아직 ack 되지 않은 세그먼트들 중 가장 시퀀스 넘버가 낮은 세그먼트를 재전송 후 타이머를 시작한다.
- 5. ack를 받았을 경우, 만약 그 ack가 맨 앞이 아닐 때, sendbase를 거기까지 껑충 올린 후, 아직 ack를 받지 못한 segment가 없을때 타이머를 중지한다.
5번의 경우에 대한 그림이다.
92번 시퀀스 넘버에 대한 응답을 받지 못했지만, 120 ack에 의해 타이머를 멈추었기 때문에 에러가 발생하지 않는다.
2.2 TCP ACK 생성 권고
생성 권고는 (1) 이벤트에 따른 (2) 행동을 정한 내용이다.
1) 기다리는 순서 번호를 가진 순서가 맞는 세그먼트의 도착. 기다리는 순서번호까지의 모든 데이터들은 이미 확인 응답
-> 지연된 ACK. 또 다른 순서가 맞는 세그먼트의 도착을 위해 500ms 기다린 후, 도착하지 않으면 ACK를 보낸다.
2) 기다리는 순서번호를 가진 순서가 맞는 세그먼트의 도착. ACK 전송을 기다리는 다른 하나의 순서에 맞는 세그먼트가 있음
-> 즉시 2개의 순서가 맞는 세그먼트들을 ACK 하기 위해 하나의 누적된 ACK를 보낸다.
3) 기다리는 것보다 높은 순서 번호를 가진 순서가 틀린 세그먼트의 도착. 격차가 발견됨
-> 즉시 순서 번호가 다음의 기다리는 바이트를 나타내는 중복 ACK를 보낸다.
4) 수신 데이터에서 격차를 부분적으로 또는 모두 채우는 세그먼트의 도착
->즉시 ACK를 보낸다. 단, 가장 낮은 쪽까지 진행.
2.3 TCP fast retransmit
타임아웃의 기간은 종종 꽤 길기 때문에 더 빠르게 할 방법이 필요하다.
다행히도 그런 방법이 존재하는데, 바로 중복 ACK가 수신된 경우이다.
기존의 방법에서는 중복 ACK를 받더라도 타임아웃이 날 때까지 기다리는 방법을 선택했다면,
tcp의 빠른 재전송은 3개의 중복 ack를 받으면 타임아웃을 기다리지 않고 바로 재전송을 요구하게 된다.
3. TCP 흐름 제어
흐름 제어의 개념은 아주 간단하게 말해, 송신자가 전송하는 속도가 수신자의 수신하는 속도보다 낮거나 같게 하는 것을 말한다. 만약 반대의 상황이라면 수신 버퍼에 오버플로우를 발생시킬 수 있기 때문이다.
TCP에서 송신자는 수신 윈도라는 변수를 유지하여 흐름 제어를 제공하게 된다.
수신 윈도는 수신 측에서 가용한 버퍼 공간이 얼마나 되는지를 송신자에게 알려주는 데 사용된다.
TCP는 양방향성을 갖고 있기 때문에, 각각의 송신자는 별개의 수신 윈도를 유지한다.
변수 정의
- RcvBuffer : 할당된 수신 버퍼의 크기
- LastByteRead : 수신자의 애플리케이션 프로세스에 의해서 버퍼로부터 읽힌 데이터 스트림의 마지막 바이트 수
- LastByteRcvd : 수신자의 네트워크로부터 도착하여 수신 버퍼에 저장된 데이터 스트림의 마지막 바이트 수
- rwnd : 수신 윈도로, 버퍼의 여유 공간으로 설정된다.
이 변수들은 그림을 보면 단번에 이해할 수 있다.
- sender -> in-flight data = LastByteSent - LastByteAcked
- receiver -> rwnd = rcvbuffer - (LastByteRcvd - LastByteRead)
4. TCP 연결 관리
이번에는 TCP 연결이 어떻게 설정되고 해제되는지 더 자세히 살펴보자.
앞에서 계~속 말한 송수신자의 데이터 전송을 하기 전에 우선 송수신자는 "핸드 셰이크"라는 과정을 거친다.
서로 악수를 하며 "그래! 연결해도 돼!"라는 약속이며, 데이터 송수신을 허락한다.
4.1 3방향 핸드 셰이크 과정 (연결 설정)
1단계 : 클라이언트 TCP는 서버 TCP에게 특별한 TCP 세그먼트를 송신한다. 이 세그먼트 헤더 안에는 SYN 비트라고 불리는 하나의 플래그 비트를 가진다. 추가적으로 클라이언트는 초기 시퀀스 넘버를 필드에 저장한다. 아직 데이터는 없다.
2단계 : 서버에 SYN이 도착했을 때, 서버는 SYNACK 세그먼트(연결 승인)를 보낸다. 이때, 서버는 SYN flag, ACK flag, ack num, sequence num을 초기화한다. ACK num은 client가 보낸 seq num +1로 설정된다.
3단계 : 연결 승인 세그먼트를 수신하면, 클라이언트는 연결에 버퍼와 변수들을 할당한다. 그다음 클라이언트 호스트는 서버로 또 다른 세그먼트를 송신한다. 이때 연결이 설정되었기 때문에 SYN 비트는 0으로 설정되며, 이때부턴 데이터를 보낼 수 있게 된다.
과정에 대한 그림은 다음과 같다.
4.1 연결 해제
이번엔 클라이언트가 연결 종료를 희망한다고 해보자. (보통 TCP 서버는 항상 열려있기 때문에, 클라이언트가 먼저 시작합니다!)
클라이언트 TCP는 먼저 1로 설정된 FIN 비트를 포함하는 TCP 세그먼트를 송신하도록 하고, 기다린다.
이후 서버 TCP는 확인 응답 비트를 보낸 후 현재 보내고 있는 데이터들을 마무리 짓는다.
이후 마무리를 지었다는 FIN 비트를 서버가 보냈을 때, 클라이언트는 확인 응답 비트를 보내고 연결을 종료한다.
+ 추가
SYN FLOOD
해커가 잘못된 SYN을 고의적으로 계속 보내 SYN Flood 가 발생할 수 있는데,
이를 방지하기 위해 4개의 tuple(출발, 도착지 포트, ip 번호)를 가지고 해싱을 통한 4자릿수를 이용해
이상한 SYN을 걸러낼 수 있다!
'Computer Network' 카테고리의 다른 글
8. Network Layer 개요 (0) | 2020.06.06 |
---|---|
7. TCP 혼잡제어 (0) | 2020.06.04 |
5. Transport layer (6) | 2020.06.02 |
4. P2P, video streaming (0) | 2020.05.29 |
3. FTP, electronic mail, DNS (0) | 2020.05.28 |