네트워크

전송 계층

민복치 2022. 6. 27. 19:01

1. 전송 계층

전송 계층은 목적지에 신뢰할 수 있는 데이터(손상X, 유실X)를 전달하기 위해 필요하다.
전송 계층은 두 가지 역할을 한다.

  • 오류 점검 기능(오류 발생 시 데이터 재전송 요청)
  • 데이터의 목적지가 어떤 appliction인지 식별

1) 전송 계층의 통신 방식

  • 연결형 (신뢰, 정확)
  • 비연결형 (효율)

2) 통신 방식에 따른 프로토콜

  • 연결형 프로토콜 TCP Transmission Control Protocol
  • 비연결형 프로토콜 UDP User Datagram Protocol

2. TCP

전송계층에서 TCP로 데이터를 전송할 때, 캡슐화 과정에서 데이터에 TCP 헤더를 붙인다.

TCP 헤더 + 데이터 = 세그먼트(segment)

1) TCP 헤더에 담긴 정보들

출발지 포트번호, 목적지 포트번호, 일련번호, 확인 응답 번호, 헤더 길이, 예약 영역, 코드 비트, 윈도우 크기, 체크섬, 긴급 포인터, 옵션

① 코드 비트

코드 비트는 6비트로 이루어져 있고, 각 1 비트마다 역할이 다르다.

| URG | ACK | PSH | RST | SYN | FIN |
|  0  |  0  |  0  |  0  |  0  |  0  |

TCP는 연결형 통신으로, 상대방을 꼼꼼히 확인한다. 그래서 connection이라는 가상의 통신로를 확보한다. 이 connection 확립을 위해 코드 비트가 쓰인다.
ex) SYN 패킷을 보내면 코드비트의 SYN이 1로 활성화 된다.

3-way handshake
connection 확립할 때 일어나는 과정이다.

3-way handshake

1) client가 연결 확립 요청(SYN)을 보낸다.
2) server가 client의 SYN에 대한 확립 응담(ACK)과 함께 데이터 전송 허가를 받기 위한 SYN을 동시에 보낸다.
3) client가 server의 SYN에 대한 ACK를 보내면 connection이 확립된다.

4-way handshake
connection을 종료할 때 일어나는 과정이다.

4-way handshake

1) client가 연결 종료 요청(FIN)을 보낸다.
2) server가 client의 FIN에 대한 응답(ACK)를 보낸다.
3) server도 client에게 FIN을 보낸다.
4) client가 server의 FIN에 대한 ACK를 보내면 연결이 종료된다.

❗️ 연결 확립과 종료 과정에서 단계가 차이나는 이유
✅ client가 데이터 전송을 마쳐서 FIN요청을 보냈다고 해도, server는 아직 보낼 데이터가 남아있을 수 있다. 그렇기 때문에 FIN에 대한 ACK만 보내고, 데이터 전송을 모두 마무리한 뒤에 FIN을 보내기 때문에 연결 종료에는 4-way handshake가 일어난다.

❗️ 만약 server에서 FIN 패킷을 보내기 전에 전송된 데이터가 손상되거나 유실되어서 재전송 된 경우에는 FIN 패킷보다 데이터가 늦게 도착한다. 이럴 경우 client에서는 데이터를 어떻게 받을까?
✅ 이럴 경우를 대비하여 client는 server로 부터 FIN 패킷을 받고 나서 일정시간동안 세션을 남겨놓고 잉여 데이터 패킷을 기다리는 'TIME_WAIT' 과정을 거친다.

② 일련번호 & 확인응답 번호

  • 일련 번호: 전송된 데이터가 몇 번째인지 나타냄
  • 확인 번호: 몇 번째 데이터를 수진했는지 송신측에 알려주고, 다음 순서의 데이터 요청에도 사용됨

🐤 3-way handshake로 connection이 확립될 때, 이번 통신에 사용할 일련번호와 응답 번호가 결정된다.

일련번호와 응답번호로 통신

1) com1은 200바이트의 3001번 데이터와 확인응답 번호인 4001을 com2로 보낸다.
2) com2는 3001번 데이터를 잘 받았다는 뜻으로 4001과 다음 순서의 데이터인 3201을 com1로 보낸다.
3) com1은 com2가 말한 번호인 3201번 데이터와 확인응답 번호 4001을 com2로 보낸다.
4) com2는 데이터를 잘 받았다는 뜻으로 4001과 다음 순서의 데이터인 3401을 com1로 보낸다.

🐤 데이터 전송 중 손상이나 유실이 일어날 경우, 재전송 한다. 이를 재전송 제어라고 한다.

⓷ 윈도우 크기

앞에서 말한 통신은 세그먼트 하나를 보낼 때마다 확인 응답을 매번 하기 때문에 효율이 매우 낮다.
효율을 높이기 위해 세그먼트를 연속해서 보내고, 확인 응답을 받을 수 있다.
연속해서 전송된 세그먼트들을 임시적으로 보관하는 곳을 buffer라고 하고, buffer의 용량 크기를 윈도우 크기라고 한다.

윈도우 크기 판단 과정

🐤 윈도우 크기는 3-way handshake 할 때 알 수 있다.
🐤 윈도우 크기 이상으로 세그먼트를 전송할 경우 overflow된다.

⓸ 포트 번호

전송된 데이터가 어떤 application용인지 판단하기 위해 포트번호가 쓰인다. application들은 각각 포트 번호로 구분된다.
포트번호는 0 ~65535 까지 있고, 1023은 well-known ports로 예약된 번호들이다.
1024번 포트는 예약되어 있지만 사용하지 않는다.
1025번 이상은 랜덤 포트로 클라이언트 측의 송신포트로 쓰인다.

application 포트 번호
SSH 22
SMTP 25
DNS 53
HTTP 80
POP3 110
HTTPS 443

 

클라이언트에서 웹 브라우저로 접속할 때, 서버로 보내는 요청에는 출발지 포트(random:5000), 목적지 포트(80)로 포트번호가 지정된다. 

3. UDP

전송 계층에서 UDP로 데이터를 전송할 때, UDP 헤더를 붙인다.

UDP 헤더 + 데이터 = UDP 데이터그램

UDP는 효율성을 중시하기 때문에, 스트리밍 방식의 동영상 서비스와 같은 곳에 쓰인다.

1) UDP 헤더에 담긴 정보들

출발지 포트번호, 목적지 포트번호, 길이, 체크섬

2) Broadcast

같은 LAN에 있는 모든 컴퓨터와 장비들에 일괄적으로 데이터를 전송하는 것을 broadcast라고 한다. UDP는 브로드캐스트가 가능하다.