티스토리 뷰

네트워크

인강 ) 전송계층(2) - TCP

gaelim 2021. 5. 4. 00:14
반응형

url www.kocw.or.kr/home/cview.do?mty=p&kemId=1169634

이전 내용 요약

RDT를 배웠다. 그리고 역사상, RDT의 성능을 개선하기 위해 pipelined 방식으로 통신을 수행하게 되었다. Go-Back-N, Selective Repeat에 대해 배움.

TCP : Overview

1. TCP는 Point-to-Point의 특성을 가진다. 한 프로세스가 여러 프로세스에게 전달하는 것이 아닌, 한 프로세스가 다른 한 프로세스에게 통신하는데 활용된다. 더 엄격히 얘기하면, 한 프로세스가 여러 개의 소켓을 열 수 있으므로, 소켓 to 소켓 통신을 책임진다.
2. Reliable, in-order delivery byte stream. 신뢰성있게 순서대로 전달된다.
3. pipelined.
4. sender & receiver buffers. 누가 sender이고 누가 receiver인지 정해져있지 않다, 따라서 두 버퍼를 동시에 가지고 있다. Process A의 sender는 Process B의 receiver와, Process A의 receiver는 Process B의 sender buffer와 대응된다.
5. full duplex data. 데이터가 양방향으로 진행하는, 양방향 통신이다. 
6. connection-oriented. handshaking, 다음 시간에 주제로 다룰 것이다.
7. flow controlled. sender는 receiver가 capacity만큼 data를 전달해준다.
8. congestion controll. 네트워크의 capacity만큼 data를 전달해준다.

TCP segment 

 Application / Transport / Network / Link / Physics Layer에서, Application에서 다루는 구조체를 Message라고 불린다. Transport Layer는 Segment라는 구조체에 data영역에 Message를 담고, Header에 추가적인 메타데이터를 저장한다. Network Layer는 Packet이라는 구조체에 data영역에 Segment를 담고, Header영역에 추가적인 메타데이터를 저장한다. Link Layer는 frame이라는 구조체에 data영역에 Packet을 담는다.

강의 중 화면. 각각의 Layer에 사용되는 자료구조를 설명한다. 각각의 Layer에서 사용되는 자료구조를 이해할 때는 data영역보다는 Header에 중점을 두는 것이 좋다. 어떤 메타데이터가 들어가는지에 중점을 둔다. 왜냐하면 data의 영역은 이미 그 전 Layer에서 결정 된 뒤, 전달 되었고 그것으로 끝이난 것이기 때문이다. 이 Layer의 목적은 Header에 위치한 메타데이터를 활용하여 어떤 수행을 통해, 통신을 성공적으로 수행하는 가에 있는 것이다. Transport/Network/Link 모두 해당하는 이야기다.

1 Port 번호는 source 16bits,  dest 16bit를 가지게된다. 이론적으로 포트 번호는 2^16 = 65536 사이에 있으며, 이론상으로 한 컴퓨터에서 동시에 동작할 수 있는 네트워크 어플리케이션 개 수는 Maximum 2^16 개 이다. 
2 Seq Number, Seq 번호. 이전 시간 RDT에서 개념 다룸.
3 Ack Number, Ack 번호. 이전 시간 RDT에서 다룸.
4 CheckSum, Error detection 용도
5 Receive window, receiver buffer의 size. 이전 시간 Selective Repeat에서 receiver buffer 개념에 다루었고, Receive window의 개념은 상대방이 나의 receive window 크기를 알게해서, 내가 최대한 받을 수 있는 data의 크기를 전달하는데 의의가 있음.

TCP seq. #'s and ACKs

TCP에서 Seq#, ACKs에 대해 간단하게 살펴본다. App에서 n개의 byte를 연속적으로 송신하다고 하자. n개의 byte가 너무 커서, Transport Layer는 여러 개의 byte의 series로 아래 Layer로 전달하게 되는데, Seq #는 segment의 연속적인 byte 데이터에서 가장 첫 바이트의 번호를 차용한다. ACK은 Go Back N과 같이 Cumulative ACK 번호를 전송한다. 위 그림에서 표현하고자 하는 바는, 두 Host간의 통신이 있을 때 각각의 Host A, Host B가 sender buffer, receiver buffer를 가진다. 총 buffer는 4개. Host A는 Application Layer에서 내려받은 byte의 seq은 42이고, seq 42를 헤더에 저장해서 전달하는 것이다. 이때 Ack은 79인데, 이것은 Host A의 receiver buffer에는 78 byte의 데이터를 잘 받았고, Host B로 부터 seq 79 데이터를 받을 차례라고 알려주는 것이다. Host A도 Host B로 부터 데이터를 전달받아 Host A의 Application Layer로 전달해야기 때문이다. 정상적으로 첫 화살표의 통신이 완료되었을 땐,  Host B는 Seq 79와 Ack 43을 담아 전달한다. 이 것이 계속 반복되며, TCP에서는 Seq, Ack이 각 각의 Host에서 동시에 사용되며 통신이 수행된다 는 점이 중요한 점이다. 그리고, 각 각의 Syn, Ack은 상대방의 Syn, Ack과 교차 대응한다.

강의 33분 질문) Seq, Ack은 항상 교차 대응하는가? 만약 나는 보낼게 없는데 ACK만 가능하지 않는가?. 답) 우선은 내가 전달할게 있어서 그 것을 기다리다 Seq을 날리면서 같이 Ack도 날릴지, 아니면 대답할게 없어도 바로 Ack이라도 태워서 보낼지는 지금 강의 수준에서 다루긴 조금 난해한 문제다. 쉽게 흐름을 정리하자면, HOST A, HOST B 각자 할 말Seq, 들을 말Ack이 있는 상황 임은 분명하다. 아까 질문에 대해 결론부터 말하자면 TCP의 권고사항은, data가 들어오면 바로 즉석해서 Ack를 날리는 것보다는 Timing을 이용하여, 그것을 기다리다 전송하게된다. Timing을 기다리는 이유는, 1) Timing 내에 수신 Host에게 유의미한 Seq이 발생할 수도 있고, 2) TCP는 pipelined이기에 발신 Host에서 여러 segment를 연속해서 보내기 때문이다. 그래서 TCP에서는 유효한 시간동안 들어오는 segment를 수신하고, Cumulative Ack을 날리는 이유기도 하다. Advanced한 이야기다.

Timeout 

TCP에서 packet loss를 판단하기 위해, timeout value를 결정해야한다. timeout value는 작게하면, recovery는 빠른 대신 overhead가 크고, 크게하면 그 역의 상황이 발생한다. loss를 확실히 판단 하면서도, timeout value를 작게 잡기 위해 어떠한 방법이 필요할까? data를 발송하고 ack을 받는데까지 걸리는 시간이 RTT(Round-Trip-Time)인데, RTT보다 더 시간이 걸리면 loss라고 봐도 되지 않냐는게 출발점이다. 그러나 Host A와 Host B가 통신을 수행할 때, 주고받는 모든 segment에 대해 RTT가 homogeneous할까? 그렇지 않다. segment는 지나가는 경로(Router)가 다르기 때문이다. 그리고 심지어 모든 경로가 같다하더라도, 각 각의 segment가 Router에 도착하는 주변의 여러 요소 상황 때문에 개별적으로 다른 Queueing Delay가 발생할 수 있는 것이다. 확률적인것이다. 아래 도표 중 파란 점은 실제 측정된 SimpleRTT 이다.

예상 RTT를 계산하기 위한 지수평활법. 운영체제에서 Process의 Burst Time을 유추하는데에도 쓰이는 간단한* 계산식이다.

지수평활법으로도 outlined를 커버하기에 충분하지 않기 때문에, safety margin을 이용한 조금 더 완화된 RTT를 이용한다.

공식은 중요하지 않다. TCP에서는 timeout을 설정할 때 RTT를 이용한다는 점이다.

TCP의 reliable Transfer

1 TCP는 rdt 서비스를 활용한다.
2 Pipelined segment를 이용한다.
3 Cumulative acks을 활용한다.
4 TCP는 single Timer를 이용한다. Go Back N 방식에서도 Single Timer를 이용하였는데, GBN에서는 Timer expired가 발생하면 Windows size안의 모든 data를 요청하지만, TCP는 해당 segment만 요청한다.
5 timeout이 발생하거나, duplicate acks이 발생할 때 재 전송이 실행된다.

위는 시나리오에 대한 그림이다. TCP의 ACK은 cumulative acks이다. 위 예의 ACK은 sender의 seq+ 전송된 bytes 크기로 반환하는 예제이다. 시나리오에서 특징적인 것은, timeout일 때, 특히 마지막은 cumulative Ack의 장점이 될수도 있다. 받는 즉시 ACK=100을 보내지 않고, 120 까지 기다렸다가 한번만 ACK 120 보내는 시나리오를 생각해보면 더 이익일 수 있다. 

그리고, TCP에선 loss를 굳이 Timer를 무작정 기다리지 않아도 된다는 점에 있다. receiver buffer에서 수신되는 seq에 따라 ACK 1,2,~ 100이런식으로 증가하며 보낼 것 만약 loss가 발생한 경우, cumulative Ack으로 인해 중간부터 ACK이 증가하지 않을것 이다. 또한 receiver buffer에서 data가 없는 칸이 생긴다. 그리고 receiver는 연속적으로 duplicated ACK Number를 보낼 것이다. TCP 규격에서는  receiver로부터 연속적으로 4번의 같은 ACK Number가 전달될 경우 retransmission의 상황으로 권고한다. 이 메커니즘을 fast retransmission이라고 한다. 굳이 특정 segment의 Timer가 만료되기 까지 기다리지 않아도 된다는 점이 장점이다. optimization 기법 중 하나이다. 그러나 Timer는 필수 요소이며, Fast Retransmission은 부가적인 optimization 요소이다.

 

반응형