[Computer Network] Stream delivery with Sequence number, and ACK

G·2023년 3월 7일
0

Computer Network

목록 보기
3/20


Transfer layer는 segment를 관리하며, TCP의 segment는 default 값으로 536bytes에서 최대 1kbytes까지 생성할 수 있다. 만약 2mb(2000kbytes) 크기의 데이터를 전송한다면 이는 2천개의 segment가 전송되는 것이다.

Transfer layer에서의 TCP protocol 기반으로 생성되는 segment의 구조, 원리를 UDP protocol과 비교하여 자세하게 알아보자.


위의 테이블은 0부터 1023까지 이미 지정된 포트 번호들이다. HTTP의 포트 번호는 80번이지만 웹 서버가 꼭 이것을 따라야 하는 것은 아니다. 다른 포트번호를 사용할 수 있지만, Header(URL)에 80번이 아닌 포트번호를 꼭 입력해줘야 한다.


위의 이미지는 TCP protocol의 Stream delivery로 데이터를 전송하는 방식이다.
이와 디른 개념인 UDP protocol의 Boundary delivery를 통해 이해해보자.
만약 데이터를 네트워크를 통해 전송할 때, 이의 packet을 프로그래밍 한다 가정해보자.
packet을 type(boundary)별로 생성하여 전달한다 했을 때, 이를 그대로 따르는 것을 Boundary delivery라 칭한다.
Stream delivery는 이와 달리, 데이터를 하나의 sequence로 나열하여 데이터를 전송한다. 여기에 사이즈를 기준으로 번호를 매겨 각각의 segement로 표현하는 것이다.

그렇다면 TCP는 데이터 전송 과정 중 데이터를 처음 만드는 protocol이다.

위의 이미지에서 Sent는 전달된 데이터지만, 재전송이 일어날 수 있기 때문에 저장된 데이터이다. Not sent는 곧 보내질 데이터이다. client건 server건 sending, receiving buffer를 모두 가지고 있으며, 위의 이미지는 원할한 이해를 위해 표현되었다.

Sequence number

하나의 Sequence에 번호를 붙여 segment로 나타낸다 하였다. 이는 32bit으로 표현되는 숫자(int) 중 임의의 번호로 시작되지만 크기를 기반으로 표현된다.


5000bytes의 파일을 전송했을 때, 임의의로 10001번을 선택했다. 패킷 하나당 1000bytes를 차지한다 했을 때, 이를 시작 번호부터 크기를 더해주며 segment를 구분한다.
그렇다면 10001, 11001, ... , 14001 까지 번호가 매겨진다.

The acknowledgement number(aka ACK)

이 stream을 받았을 때, 데이터 제대로 받았다는 것을 알려주는 응답이다. 이는 두 가지 방법이 있다.

Selective ACK란 수신한 데이터의 Sequence number를 전송한다.
Cumulative ACK란 다음에 받아야할 Sequence number를 전송한다.
TCP는 후자의 방법을 사용한다.


Options and padding 부분을 제외하고 20bytes로 표현되어 있다. 지금까지 ACK number까지 총 12bytes를 확인하였다.

header와 data를 전송했을 때, header는 20~60bytes인데, 이 둘을 어떻게 구별할까?
HLEN 부분에 header의 크기를 저장한다. 이 정보를 통해 option과 padding의 끝을 알 수 있게 된다. 그런데, 4bit를 통해 표현하면 16개의 수를 표현할 수 있다. 그런데 header의 최대 크기는 60이기 때문에 크기가 모자르다. 6bit가 있어야 60까지 표현할 수 있지만 4bit로 효율적으로 크기를 계산할 수 있는 방법이 있다.

header의 크기가 60bytes라 했을 때, 이를 4로 나누어 HLEN에 저장한 후 이 데이터를 받다 HLEN의 값과 4를 곱하면 된다. 최대 15(1111 4bit의 최대값)까지 표현되기 때문에 60bytes까지 표현할 수 있다.

4로 무조건 나누어 떨어지나? header는 무조건 4bytes로 나누어 놓았다. 만약 4bytes가 채워지지 않았다면 padding을 사용하여 4로 나누어 떨어지게 만든다.

이를 통해 header의 끝, 즉 option의 끝을 4bit으로 알 수 있게 된다.

profile
열심히 안 사는 사람

0개의 댓글