일일 정리

Selective repeat 프로토콜, TCP 프로토콜, TCP의 신뢰적인 데이터 전송, 리눅스 - 생성된 디스크 사용 과정

mysecurity 2025. 1. 20. 17:42
Selective repeat 프로토콜

 

● 송신자 측 설정

상위 레이어에서 데이터가 수신된 경우

: 패킷의 다음 시퀀스 넘버를 검사하고 윈도우 내에 있으면 패킷을 전송한다.

 

timeout(n)이 발생한 경우

: n번 패킷을 재전송하고 타이머를 다시 시작한다.

 

ACK(n)을 수신한 경우

: n이 윈도우에 있다면 패킷이 수신된 것을 확인한다.

: n이 send_base와 같다면 send_base는 가장 작은 시퀀스 넘버를 갖는 미확인 패킷으로 이동한다. 윈도우 내에 이 전송 패킷이 있으면 전송한다.

 

● 수신자 측 설정

n번 패킷을 수신한 경우

: ACK(n)을 송신한다.

: 기다리던 패킷보다 큰 번호의 패킷이 온 경우 버퍼링한다.

 

 

Selective repeat 통신 시나리오는 다음과 같다.

Selective repeat 통신 시나리오

 

Selective repeat 응답 패킷 소실 시 통신 시나리오는 다음과 같다.

Selective repeat 응답 패킷 소실 시 통신 시나리오

 

TCP 프로토콜

 

point‐to‐point

: 단일 송/수신자간의 통신이다.

 

신뢰적인in‐order(순서에 맞는) 바이트 스트림

: 메세지에 구분이 없다.

 

pipelined           

: RTT내에 윈도우사이즈만큼 패킷을 보내는 방식이다.

: 혼잡 제어나 흐름 제어를 통해 윈도우 사이즈를 제어한다.

 

buffer

: 송/수신 측은 버퍼링을 갖는다.

송신 측이 버퍼링하는 패킷은 윈도우 안의 응답안 된 패킷, 수신 측이 버퍼링하는건 기다리던 패킷보다 시퀀스 넘버가 큰 패킷이다.

 

full duplex

: 동일 커넥션에 양단이 동시에 데이터를 전송할 수 있다.

 

connection oriented

: handshake를 먼저 수행한다.

: 통신 시작 요청을 보내는 것은 클라이언트이다.

 

Flow control

: 송신자가 리시버를 압박하지 못하도록 리시버가 전송량을 통제한다. 즉, 윈도우사이즈 상한선을 정한다.

 

 TCP seq#와 ACK

seq#

- 바이트 스트림 넘버를 사용한다. 세그먼트의 첫 번째 바이트가 내가 보내는 총 데이터에서 몇 번째인지를 표시한다.

ex) hello -> h가 seq1이다. 

 

ACKs

- 다음에 받을 첫번째 바이트의 순서번호이다.

- 누적 ACK가 가능하다.

 

[그림]

 

 TCP의 RTT / Timeout

RTT와 Timeout를 설정하는 계산보다 컨셉의 이해가 중요하다.

 

타임아웃을 설정할 때 기본적으로 RTT보다 커야한다.

- 너무 작은 경우: 불필요한 재전송이 일어난다.

- 너무 큰 경우  : 세그먼트 손실에 대한 대응이 늦어진다.

 

RTT는 네트워크 상태에 따라 값의 변동이 크다.

- 네트워크가 불안정한 경우: 타임아웃 시간과 Estimated RTT(RTT 추정치)의 차이가 커야한다.

- 네트워크가 안정적인 경우: 타임아웃 시간과 Estimated RTT(RTT 추정치)의 차이가 작아도 된다.

 

TCP의 신뢰적인 데이터 전송

 

TCP는 Pipelined 프로토콜이다.

누적 ACK를 사용한다.

단일 재전송 타이머를 사용한다.

 

재전송을 일으키는 이벤트

- 타임아웃

- 중복 ACK

 

 TCP의 송신자 이벤트

 

App로부터 데이터를 수신한 경우

: seq#를 가진 세그먼트를 생성한다.

: seq#는 첫 번째 바이트의 바이트 스트림 번호이다.

: 타이머를 시작한다. (다른 세그먼트에 의해서 타이머가 실행 중이 아닐 때)

 

timeout

: 타임아웃을 일으킨 세그먼트를 재전송한다. 이때 send_base의 세그먼트만 재전송한다.

: 타이머를 재시작한다.

 

ACK가 확인 안된 세그먼트의 ACK인 경우

: ACK의 seq#가 send_base보다 크면 이전에 확인 응답이 안된 세그먼트에 대해 확인하고 send_base를 갱신한다.

: 아직 확인 응답이 안된 세그먼트가 존재하면 타이머를 재시작한다.

 

TCP 통신 시나리오는 다음과 같다.

TCP 통신 시나리오

 

TCP 응답 패킷 소실 시 통신 시나리오는 다음과 같다.

TCP 응답 패킷 소실 시 통신 시나리오

 

리눅스 - 생성된 디스크 사용 과정

 

생성된 디스크는 fdisk -> mkfs -> mount 의 과정을 거쳐 비로소 사용할 수 있게 된다.

 

fdisk

fdisk는 파티션을 만드는 단계이다.

# fdisk   디스크명

ex) # fdisk  /dev/sda 

 

- fdisk 프롬프트에서 사용하는 명령어

p : 현재 파티션 상태를 출력한다.

d : 파티션을 삭제한다.

n : 파티션을 생성한다.

t : 파티션을 변경한다.

w : 저장 후 종료한다.

q : 취소 후 종료한다.

 

mkfs

mkfs는 파일 시스템을 만드는 단계이다. 윈도우에서는 포맷한다는 표현을 사용한다.

# mkfs-t  [파일시스템타입]  파티션명

ex) # mkfs.xfs  ‐f  /dev/sdb1

 

 mount

mount는 특정 파티션 디바이스를 특정 디렉토리에 연결하는 단계이다.

# mount  [‐a]  [‐t  [FStype]]  [파티션명]  [디렉토리]

ex) #  mount  ‐t  xfs  /dev/sdb1  /home/data1

 +

- o 옵션 : 마운트 옵션을 추가로 지정한다.

               noatime   : atime을 갱신하지 않는다.

               remount   : 옵션 변경을 위해 재마운트한다.

               ro             : Read Only로 정의한다.

- t 옵션  : 파일 시스템 양식을 정한다.

- a 옵션 : /etc/fstab의 내용을 읽어 모두 마운트한다.

- B 옵션: 바인드 마운트로, 디렉토리를 디렉토리로 마운트한다.  (01.21 수정)

 

fdisk -> mkfs -> mount 의 과정을 거쳐 디스크를 사용할 수 있게 된 화면

 

- umount

umount는 mount된 파일 시스템을 시스템으로부터 제거한다.

# umount [디렉토리명] 또는[장치명]

ex) #  umount  /home/data1

 

이미 파일이 들어있는 디렉토리에 파티션을 마운트해버리면 기존의 파일은 은닉되어 접근할 수 없다.

 

blkid

blkid는 파티션의 정보를 확인하는 명령어이다.

# blkid

blkid 실행 화면


# blkid 를 실행하면 위와 같이 파티션의 UUID를 확인할 수 있다. UUID는 파티션의 고유 정보로 하드웨어가 생성될 때 생긴 ID이므로 디스크의 위치가 바뀌어도 동일하게 유지된다.

 

findfs

UUID나 라벨명으로 장치명을 확인한다.

# findfs LABEL=[라벨명] 

# findfsUUID=[uuid]