TCP overview
- TCP는 point to point 통신. 프로세스와 프로세스 딱 한 쌍의 프로세스를 가진 통신을 책임진다. 더 엄격하게 얘기하면 하나의 소켓과 하나의 소켓 즉 소켓 소켓 한쌍끼리의 통신을 책임진다. 프로세스 하나의 소켓 여러 개 열 수 있기 때문에 엄밀히 말하면 소켓과 소켓 그렇기 때문에 point to point 통신.
- reliable, in-order byte stream. 하나도 유실되지 않고 가면서 순서대로 간다.
- pipelined. 파이프라인 방식 한꺼번에 쏟아 붙는다. 윈도우 크기만큼.
- send & receive buffers. sender에서 사용하는 윈도우 혹은 버퍼 sender buffer. 윈도우 자체가 버퍼라는 개념 이 윈도우 크기만큼 sender는 에크너리즈먼트를 받지 않고 쏟아 부었기 때문에 이 중에 유출된 게 있을 수 있고 그 것들을 다 재전송해야 하는데 재전송하려면 어딘가에 저장을 해놓아야 한다. → 버퍼에 저장. 그리고 그 윈도우 크기에 정확히 해당하는 버퍼를 receiver 쪽에서도 가지고 있다. 순서없이 들어오는 패킷들을 버리지 않고 여기다가 잘 보관하고 있기 위한 용도. 모두가 샌더고 모두가 리시버 그래서 sender buffer, receive buffer 다 가지고 있다.
- full duplex data. 지금까지 얘기를 할 때는 샌더 리시버 이런 개념이 있지만 실제론 어떠냐면 모두가 sender이자 receiver. 데이터가 양방향으로 진행.
- connection-oriented. handshaking(추후에 나옴)
- flow controlled. receive buffer에 공간이 별로 없다면 윈도우 크기만큼 부어봤자 의미가 없다. 그래서 sender는 receiver가 받을 수 있는 능력 만큼 보내줘야 하는데 그게 flow controlled.
TCP segment
HTTP request와 response 즉 우리가 전달하고자 하는 메시지는 소켓이라는 인터페이스를 통해서 트랜스포트 레이어 즉 TCP로 내려오게 되면 TCP의 전송 단위인 세그먼트의 데이터 부분으로 들어가게 된다. 편지 내용같은 부분. 그리고 편지봉투 겉면에 메타데이터 즉 부가적인 정보들이 써 있고 그게 바로 헤더. 이 이후의 과정을 간략하게 적으면
- 네트워크 레이어로 내려가게 되면 네트워크 레이어의 전송 단위인 패킷이라 것인데 패킷이라는 편지 봉투에 세그먼트라는 편지지가 들어간다. 마찬가지로 이 전체가 링크레이어의 전송 단위인 프레임의 데이터 부분으로 여기 들어가서 결국에는 편지지가 편지 봉투에 담기고 그 편지봉투가 더 큰 편지봉투에 담기고 해서 엄청 큰 서류 봉투 하나가 나온다.
아직 TCP 트랜스포트 레이어 얘기하고 있기 때문에 아래 레이어가 어떤 내용인지 관심없고 아래 structure에만 집중하면 된다.
TCP 세그먼트의 해더 구조는 중요. 어떤 필드들이 있고 각각 어떤 의미를 가지는지 또 세그먼트의 헤더와 더불어 IP 패킷의 헤더 필드들 역시 중요.
- port 번호 각각 16 bits. 2의 16승의 -1. 65,535개. 이론상으로 한 컴퓨터 내에서 동시에 동작할 수 있는 네트워크 애플리케이션의 개수는 6만 5천개 정도.
- checksum은 이 세그먼트가 네트워크를 거쳐 오는 동안 에러가 있었는지 없었는지 에러 디텍션을 위한 ckecksum
- window는 지금 나의 receive buffer에 얼마만큼 빈 공간이 있는지 계속 피드백 리포트를 상대방한테 해줘서 상대방이 많이 안 보내고 딱 그만큼 보내게 하는 그 공간 크기를 위한 window data
TCP seq. #’s and ACKs
a가 클라이언트고 b가 서버라고 쳤을 때 b가 그냥 echo 서버. a가 보내는 데이터 그냥 그대로 echo back 해주는 것. 이 사이에 데이터 교환이 TCP를 통해서 이루어지는데 즉 데이터가 TCP 세그먼트에 담겨서 가는데 그 세그먼트에 필드 acknowledgement number 필드와 sequence number 필드에는 어떤 정보들이 적혀 있는지 한번 적어본 것.
ack 79의 의미? 78번까지 다 잘 받았으니까 79번 받을 차례.
Timeout - function of RTT
TCP는 reliable data transfer이기 때문에 a와 b 사이에 세그먼트를 주고 받는데 중간에 세그먼트가 유출됐다면 ‘타이머’ 메카니즘을 통해서 그걸 탐지한다. 타이머가 터지기 전에 피드백이 오면 오케이고 그때까지 피드백이 안으면 유실로 간주. 타이머라면 타이머 값을 세팅해야 되는데 그 타이머 값을 얼마만큼 세팅할 거냐가 아주 중요한 이슈.
타이머 벨류를 작게 하고 크게 하고에 대한 장단점은 작게 하면 리액션, 리커버링 빠른 대신 네트워크에 쓸 데 없는 부담을 줄 수 있고 크게 하면 그 반대. 그러면 타이머 값은 적당히 잘 잡는 게 중요.
세그먼트가 목적지에 갔다가 에크가 돌아올 때까지 시간을 RTT 라운드 트립 타임이라고 부른다.
라운드트립타임이 주어진다면 라운드트립타임보다 더 시간이 걸리면 유실이고 덜 걸리면은 오케이고 그렇게 생각하면 되지 않을까 라고 그냥 개념적으로 생각을 해서 이 타임 아웃 벨류를 RTT로 대충 생각해 보자라는 게 이제 출발점.
- RTT라는 것은 source와 destination은 고정되어있는 상황. 그런데 모든 세그먼트에 대해서 RTT값이 고정인가? 현실적으로 그렇지 않음. A와 B사이에 주고받는 세그먼트들의 RTT값은 하나같이 다 다르다.
- 왜? 각 세그먼트들이 지나가는 경로가 다르기 때문에 어떤 애는 태평양으로 지나고 어떤 애는 대서양을 지나고..
- 심지어 경로가 같다고 해도 RTT 값이 다 다르다. 같은 라우터를 지나간다고 해도 큐잉 딜레이. 그때 그때마다 큐 상황은 정말 다양하게 변하기 때문.
RTT가 다 각 세그먼트가 다르기 때문에 어떤 하나의 RTT를 사용해서 타임아웃을 잡기가 쉽지가 않다. 대표할 수 있을 만한 RTT 값이 필요. ‘EstimatedRTT’
Example RTT estimation
TCP reliable data transfer
- piplined segments: TCP에서 동작하는 reliable data transfer는 파이프라인 방식 즉 윈도우 사이즈만큼 한번에 쏟아 붇는다는 뜻.
- TCP에서 사용하는 Acks는 cumulative acks. acks 10번이라고 하면 9번까지 잘 받았고 10번 보내라는 의미.
- single retransmission timer. TCP는 타이머를 하나 쓴다. Go-Back-N도 타이머 하나인데 Go-Back-N은 타이어 하나가 expire되면 한 윈도우에서 버퍼에 와 있는 것 다 재전송 반면 TCP에서는 타이머가 expire되면 해당하는 세그먼트만 재전송
- retransmissions은 timeout events와 duplicate acks에 의해 일어난다
'컴퓨터네트워크' 카테고리의 다른 글
7. 애플리케이션, 트랜스포트 그리고 네트워크 계층 (0) | 2023.11.01 |
---|---|
5. 트랜스포트 계층 2-1 (0) | 2023.10.27 |
4. 트랜스포트 계층 1 (0) | 2023.10.26 |
3. 애플리케이션 계층 1 (0) | 2023.10.25 |
2. 컴퓨터네트워크 기본2 (0) | 2023.10.24 |