본문 바로가기
Network/네트워크 이해

[Network] 전송 계층

by 8희 2022. 10. 29.

TCP 세그먼트 TCP 헤더

- 세그먼트: 전송 계층에서의 PDU(프로토콜 데이터 단위)

- TCP 세그먼트: 응용 계층의 데이터에서 TCP 헤더를 붙여 캡슐화한 것 / 네트워크 계층에서 받은 패킷에서 IP헤더를 떼어내는 역캡슐화를 거친 것 -> 캡슐화 시 TCP 헤더 부착, 역캡슐화 시 TCP 헤더 제거

- 전송계층에서의 핵심이 되는 TCP(Transmission Control Protocol)은 신뢰성과 정확성이 특징!

 

* TCP 헤더의 구조 (TCP 세그먼트의 핵심)

- TCP 헤더는 목적지까지 데이터를 신뢰성 있게 전송하기 위해 필요한 정보를 가지고 있다. 

- 출발지 포트 번호나 목적지 포트 번호는 직관적으로 이름에서 알 수 있듯이, 각각 출발지(혹은 목적지) 응용 프로세스의 포트 번호 / 포트 번호라는 것을 유의!

- 일련 번호(= 순서 번호 = sequence number)는 송신지가 지정하는 순서 번호

- 확인 응답 번호는 데이터를 정상적으로 수신했을 시 보내는 번호 / 받은 데이터에 Sequence Number에 1을 더해 해당 데이터를 정확히 받았음을 알린다. 

헤더의 길이는 옵션 필드가 가변적인 이유 때문에 정확하게 헤더의 길이를 파악하기 위해 사용

예약 영역은 나중에 사용하기 위해 남겨둔 예비 필드 

Flag라 불리는 코드 비트는 총 6개의 비트(URG, ACK, PSH, RST, SYN, FIN)로 구성 / 각 비트가 활성화 되면서 데이터 전송에 사용된다. 

윈도우 크기는 TCP 흐름 제어를 위해 사용되는 필드 / 한 번에 전송할 수 있는 데이터의 양을 의미하는 값

체크섬은 오류 검출 용도 / TCP 헤더와 데이터에 대해 체크섬 방식으로 계산한 결과값을 '체크섬' 필드에 저장 / 가상 헤더를 추가로 포함

긴급 포인터는 코드 비트 필드의 URG 비트 설정과 함께 사용 / 긴급 데이터 처리

 


3-way handshake, 4-way handshake

* 3-way handshake

- 세선 연결 확립- 패킷 요청을 세 번 교환하는 과정

1) SYN

- 통신을 하기 위해서 A가 B에서 통신을 하기 위한 '연결' 확립을 해달라고 요청(SYN)- 이때 SYN 비트가 활성화 되어 1로 바꾸니 세그먼트를 전송

2) SYN + ACK

- B는 A가 보낸 요청을 받은 후에 응답하겠다고 응답을 회신하기 위해 연결 확립에 대한 응답(ACK)를 보낸다.- 동시에 B도 A에게 데이터 전송에 대한 허가를 받기 위해 연결을 확립해달라고 요청(SYN)- 이때 ACK 비트와 SYN 비트가 1로 활성이 된 세그먼트를 전송

3) ACK

- B의 요청을 받은 A도 연결 확립에 대한 응답(ACK)를 보낸다.- ACK 비트가 1로 활성화된 세그먼트를 전송

 

* 4-way handshake

- 세션 연결 종료- 패킷 요청을 네 번 교환하여 마무리하는 과정

1) FIN

- A는 B에게 연결 종료(FIN) 요청- FIN이 1로 활성화된 세그먼트를 전송

2) ACK

- B는 A에게 연결 종료에 대한 응답(ACK)를 반환- ACK가 1로 활성화된 세그먼트를 전송

3) FIN

- B도 A에게 연결 종료 요청(FIN)을 보낸다. - FIN이 1로 활성화된 세그먼트를 전송

4) ACK

- A도 B에게 연결 종료에 대한 응답(ACK)을 반환- ACK가 1로 활성화된 세그먼트를 전송

 

- 두 과정에서 TCP 헤더의 플래그(코드 비트)가 중요한 역할!- 초깃값은 0인 코드 비튿르이 각 과정에서 활성화되면서 1로 바뀌어서 전송이 된다. 

 


TCP 에러제어

* TCP 에러제어

- 세그먼트의 손실 및 훼손, 순서가 어긋난 경우, 중복된 경우 이에 대한 제어나 처리하는 방법 중 하나

- 먼저 에러를 검출하는 과정을 거치며, 그 방법으로 CRC나 체크섬 사용

- 신뢰성 있는 데이터 전송

 

* 에러 정정 (ARQ)

1) Stop-and-wait

- Timeout 시 ack를 받지 못한 패킷부터 기다렸다가 재전송

- 식별을 위해서 0과 1의 패킷(혹은 ack)을 번갈아 전송

- 단점: 확인 응답이 올 때까지 기다리는 방식이기 때문에 비효율적!

 

2) Go-Back-N

- Timeout 시 ack를 받지 못한 패킷부터 '모두' 다시 전송

- 어느 한 패킷이 돌아오지 않아 에러 발생 시 그 번호의 패킷부터 다시 재전송

- 한마디로 뒤로 돌아가서 다시 재전송하는 방식

 

3) Selective Repeat

- ack를 받지 못한 패킷을 선택적 재전송

- 패킷이 도착하지 않아 타임아웃되었을 시 선택적으로 재전송하고, 버퍼에 저장하는 방법을 이용하는 방식

 


TCP 흐름제어

- TCP  흐름제어: 송수진의 데이터 처리 능력이 달라 데이터가 유실되는 것을 방지하는 기법

- Stop-and-Wait 기법은 비효율적이라는 단점이 있어서 주로 슬라이딩 윈도우 기법 사용

 

- 슬라이딩 윈도우 기법: 각 송수신지에 있는 슬라이딩 윈도우를 활용하는 방식 / 계속해서 자신의 윈도우 크기를 상대에게 알려주는 '윈도우 광고 기법' 사용

- Rwnd(Receiver Window): 수신 측 윈도우

- Cwnd(Congestion Window): 송신 측 윈도우

- 송신지 윈도우 크기는 수신지 윈도우 크기에 맞춰서 상대방이 받을 수 있도록 크기를 맞춘다. 

 

-> 윈도우 크기를 조절하기도 하고 윈도우 크기를 알리기도 하는 기법을 통해서 TCP는 흐름제어의 동작을 한다!

 


TCP 혼잡제어

- 혼잡(Congestion) 상황: 데이터의 수가 과도하게 증가하거나 데이터가 유실되는 상황 등

- TCP  혼잡제어: 네트워크 내의 데이터를 조절하여 오버플로우 현상을 방지하는 기술 / 혼잡 상황을 방지하거나 해결하는 기능

 

* TCP가 혼잡 발생 인식

- 데이터를 송신하고 타임아웃되어 전송한 세그먼트 재전송할 경우

-  3개 이상의 중복된 ack를 수신할 경우

 

* 혼잡 발생 전

1) Slow Start

- TCP는 세그먼트들을 Slow Start방식으로 하나씩 전송

- 이때 cwnd의 값은 1

- 1, 2, 4, 8 이런 식으로 cwnd의 값을 지수적 증가 방식을 통해 세그먼트를 임계값까지 전송

- 여기서 임계값 = slow start threshold(=ssthresh)

- ssthrest 값까지 cwnd가 도달하게 되면 TCP는 혼잡 상황으로 갈 위험이 높다고 여겨져 Additive Increase 기법을 사용하여 혼잡을 회피

 

2) Additive Increase

- cwnd를 하나씩 증가하면서 혼잡을 회피

- 결국 혼잡이 발생한 상황을 감지하게 되면 Multiplicative Decrease 방식 수행

 

* 혼잡 발생 후

- Multiplicative Decrease: ssthresh 값을 cwnd 1/2로 축소

- 혼잡이 발생한 상황의 경우에 따라 다르게 동작

 

1) 세그먼트 전송 후 타임아웃 되어서 재전송 해야 하는 상황

 

2) 3개 이상의 중복된 ACK를 수신한 경우

 


포트 번호

- 포트 번호: 데이터의 목적지가 어떤 애플리케이션인지 구분하는 번호

 

* Well - Known 포트 (0 ~ 1023), 국제 인터넷 주소 관리 기구(IANA)에서 지정한 포트 번호

 


UDP

* UDP 프로토콜

- 효율성

- 비연결형 통신 -> 속도가 빠르다! -> 동영상 스트리밍 방식이 적합!

- 연결 확립 절차 x -> LAN 안에 있는 모든 컴퓨터의 데이터를 일괄적으로 전송!

- 브로드 캐스팅 전송 방식에 적합!

 

* UDP 세그먼트

- 캡슐화 시 UDP 헤더 부착