독서/(하루 3분)네트워크 교실

(하루 3분)네트워크 교실 5장 - 커넥션과 포트 번호

studylida 2022. 12. 8. 21:00

5장 : 커넥션과 포트 번호

4계층의 역할
1계층은 '케이블이 연결되어 있는 상대에 대한 신호 전달', 2계층은 '신호를 주고받을 수 있는 상태일 때 세그먼트 내에서 어떻게 데이터 송수신 하는지', 그리고 3계층은 '세그먼트=네트워크 사이에서 어떻게 데이터를 송수신 하는지'에 관한 내용이었다.
=> 즉, 어떤 컴퓨터에서 어떤 컴퓨터로 데이터를 전송하기 위해 필요한 것이 1계층부터 3계층까지의 역할이었다.

4계층 이상의 상위 계층에서는 '데이터를 운반'하는 직접적인 동작은 하지 않는다. 4계층 이상의 상위 계층에서는 전달할 · 전달될 데이터에 대해 필요한 처리를 한다.
4계층의 경우는 신뢰성이 높은(에러가 적은) 데이터 전송을 하기 위한 처리를 한다. 즉, 3계층까지는 수신처 자체가 존재하지 않거나 데이터가 도중에 손실됐거나 에러에 의해 파기됐다는 등의 문제들은 신경 쓰지 않는다.

에러 복구 : 4계층의 역할 중 하나로 도달하지 않은 경우에 다시 보냄으로써 에러를 없었던 것으로 한다.
1. 데이터를 수신하면, 송신처에게 수신한 것을 통지한다(확인응답). 이로써 송신처는 수신처가 데이터를 받은 것을 확인할 수 있다.
2. 도중에 에러 발생으로 데이터가 없어져서 확인응답이 돌아오지 않을 경우, 다시 보냄으로써 에러를 복구한다.

4계층은 신뢰성이 높은 통신을 위해 에러를 복구하는 것 외에 통신 상태를 확인하기도 한다. 이는 흐름 제어라는 방식으로 수행한다.
Because, 처리 능력을 넘어선 정보를 받는 경우, 그것을 다 처리할 수 없어서 정보를 파기하는 경우가 존재한다. 때문에 도처리할 수 없는 데이터가 넘쳐 흐르는(오버플로,Over flow) 것을 방지해야 한다. 넘쳐 흐르지 않도록 방지하는 행위이기 때문에 흐름 제어라고 부른다.
1. 수신처에 데이터를 보내면, 수신처는 데이터를 받아서 그것을 일시적으로 모아둔다. 그리ᄀᆃ 준비되는 대로 처리한다.
2. 처리가 늦어지거나 송신 속도나 간격이 빠른 경우 데이터가 점점 쌓이기 때문에 결국에는 모아둘 수가 없게 되어 파기해버린다. 이것을 오버플로라고 부른다.
3. 그것을 방지하기 위해 수신측은 확인응답 때에 모아둘 수 있는 데이터 양을 송신처에게 통지하여, 송신량을 가감하게 하거나 송신을 일시적으로 중지하게 한다.
애플리케이션 식별
통신에서 데이터를 주고받는 컴퓨터 소프트웨어를 애플리케이션(Application)이라고 부르는데, 사실 데이터를 주고받는 것은 대체로 컴퓨터 안의 애플리케이션이다. 이때 어느 애플리케이션이 송신한 데이터인지 어느 애플리케이션이 수신한 데이터인지 결정하기 위해서 포트 번호(Port Number)라는 것이 부여된다.
포트는 데이터를 넣고 꺼내는 가상의 출입구로, 각 애플리케이션에는 이것이 장치되어 있어서 거기에 데이터를 보낸다고 생각할 수 있다. 때문에 컴퓨터까지 도달한 데이터는 이 포트 번호를 근거로 그 데이터가 사용될 애플리케이션에 전해지게 된다.
TCP와 UDP
4계층에서는 통신에 필요한 처리를 하는데, TCP/IP 프로토콜군에서 실제로 이런 제어를 수행하는 것이 TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol)라는 두 프로토콜이다. 이 두 개의 프로토콜은 통신할 때 둘 중 어느 한 쪽이 사용된다.

커넥션
TCP에서는 애플리케이션 간의 데이터 송수신을 하는데, 이 애플리케이션 간의 송수신을 하는 데이터의 길을 커넥션이라고 한다. 커넥션은 가상적인 통신로로, 사전에 전용 통신로를 확보해 둠으로써 확실하게 데이터를 보내는 데 의의가 있다. 이 가상의 통로를 만들어 내는 것을 커넥션 확립이라고 한다.

TCP 헤더의 크기는 기본적으로 20옥텟이다. TCP 헤더 6비트의 제어비트(플래그)는 그 TCP의 데이터의 의미를 나타낸다.
커넥션 확립
커넥션을 확립하기 위해서는 상대가 데이터 전송을 허가해주어야 한다. 따라서 확실한 데이터 전송을 하는 통신로를 확보하기 위해 상대에게 데이터 전송의 허가 요청을 보내는 것이다. 그리고 요청을 받은 상대는 그것에 대한 허가를 송신처에 알리는 것이다. 이것으로 데이터가 상대에게 바르게 전달된 것을 확인할 수 있다. 즉, 통신로가 확보되었다는 뜻이 된다. 그 다음에는 반대로 수신처 측이 송신처에게 데이터 전송 허가 요청을 보낸다. 그것에 대해 송신처도 데이터 전송 허가를 보내면 쌍방향의 통로가 확보된다. 이 커넥션의 확립을 위해서는 3번 주고받아야 하기 때문에 쓰리웨이 핸드쉐이크(3way handshake)라고 부른다.


TCP의 3-way Handshaking 과정
1. A 클라이언트는 B서버에 접속을 요청하는 SYN 패킷을 보낸다. 이때 A 클라이언트는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다.
2. B서버는 SYN 요청을 받고 A클라이언트에게 요청을 수락한다는 ACK와 SYN flag가 설정된 패킷을 발송하고 A가 다시 ACK으로 응답하기를 기다린다. 이때 B서버는 SYN_RECEIVED 상태가 된다.
3. A 클라이언트는 B 서버에게 ACK를 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게 된다. 이때 B서버의 상태는 ESTABLISHED가 된다.
SYN : 상대에 대한 접속요청
ACK : 상대의 통신응답
FIN : 접속 종료


4way handshaking(종료)



포트 번호, 시퀀스 번호, 플래그 등 약 20옥텟

세그먼트 분할
TCP는 애플리케이션으로부터 받은 데이터(메시지)를 세그먼트로 캡슐화하는데, 이때 한 개의 데이터를 MSS(Max Segment Size)로 분할한다. 한 개의 데이터가 복수의 세그먼트가 되는 것이다. 그리고 각각의 세그먼트에 번호를 부여하는데 이것을 시퀀스 번호라고 한다. 시퀀스 번호란 세그먼트에 포함되어 있는 데이터의 선두 옥텟에 붙여진 번호이다. 통신할 데이터에 임의의 번호부터 순서대로 1옥텟마다 번호를 할당한다. 송신할 데이터의 맨 앞부분부터 번호를 붙이고, 송신할 세그먼트의 선두 번호를 시퀀스 번호로 삼는다.

에러 복구
TCP에서는 시퀀스 번호를 이용해서 에러를 복구한다. 먼저, 세그먼트를 수신하면, 수신한 것을 송신처에게 전달하는데 이것을 확인응답이라고 한다. 여기서 중요한 것은 TCP 헤더의 시퀀스 번호와 확인응답 번호이다. 데이터 송신 시에는 시퀀스 번호가, 확인응답에는 확인응답 번호가 중요한 값이 된다.
Insert, 시퀀스 번호는 보내는 데이터의 앞 부분에 있는 옥텟 번호, 확인응답 번호는 다음에 받고 싶은 데이터의 선두 옥텟 번호.
=> 단순히 수신만 하는 게 아니라 다음에 받을 예정인 데이터 번호까지 전달하는 것. 이를 통해 수신측이 어느 데이터까지 받았는지도 확인할 수 있다.
=> 에러가 발생해서 일정시간 동안 데이터가 상대방에게 도달하지 않았거나 확인응답이 도달하지 않았을 때는 재전송을 하게 된다.
Insert, 이때 일정시간은 RTT(Round Trip Time)라는 값으로 판단한다. RTT는 지금가지 보낸 데이터에 대해 확인응답이 돌아오기까지 걸린 시간으로 계산한다. RTT 초기값은 3초로 설정되어있고, 그 후에 확인응답이 돌아오는데 걸린 시간을 통해 동적으로 변경한다.
윈도우 제어
'세그먼트송신->확인응답'이라는 흐름은 효율이 좋은 전송방법을 사용하지 않으면 시간이 오래 걸린다는 단점이 있다. 그래서 '복수의 세그먼트전송->확인응답'이라는 형태로 바꾸어서 효율을 높여 사용한다. 이때 정확하고 확실하게, 또 효율적으로 보내기 위해 TCP는 흐름 제어의 하나인 윈도우 제어를 한다.

일단 수신한 데이터를 일시적으로 보관해 두기 위한 버퍼(Buffer)가 존재한다. 이 버퍼 보다 많은 데이터를 보내면 오버플로가 일어나기 때문에 상대방에게 자신이 어느 정도 버퍼량을 가지고 있는지 알릴 필요가 있다. 이때 버퍼량을 윈도우 사이즈라고 한다. 이 윈도우 사이즈를 상대방에게 알려줌으로써 윈도우 사이즈만큼의 데이터를 한 번에 보내도 오버플로가 일어나지 않는다는 것을 알 수 있게된다. 즉, 윈도우 사이즈는 확인응답을 기다리지 않고 보낼 수 있는 데이터 양이 된다.

이렇게 윈도우 사이즈를 이용해서 상대방에게 자신의 버퍼량을 전달해서 확실하게 수신할 수 있는 용량의 데이터만 송수신하는 방식을 윈도우 제어라고 부른다.

애플리케이션 간 통신
PC에서 브라우저 소프트웨어 메일 소프트웨어 등 통신하는 어플리케이션을 여러 개 사용하는 경우, 어느 애플리케이션 용도의 데이터인지를 식별하지 않으면 안된다. 그래서 포트 번호라는 것을 사용해서 각각의 데이터가 어느 애플리케이션으로부터 송신되었는지, 어느 애플리케이션 수신인지를 결정한다. 이는 각 컴퓨터 내부에 통신 데이터를 흐르게 하기 위한 가상의 출입구가 존재하고, 각 애플리케이션은 그 중의 하나를 선택해서 데이터 송수신의 입구로 삼는 것으로 이해할 수 있다.

포트는 2^16개 존재하고, 각각 0부터 번호가 매겨져있다. 통신중인 애플리케이션은 각각 이 포트 번호와 접속하고 있고, 이 포트에 붙여진 포트 번호로 데이터를 보낼 애플리케이션을 특정한다. 실제로는 IP 주소와 포트 번호를 사용해서 어느 컴퓨터의 어느 애플리케이션인지 식별한다.
Warning, 때문에 수신처 포트 번호를 모르면 데이터를 보낼 수 없고, 수신 받을 애플리케이션이 포트와 접속해 있지 않으면, 데이터는 도달할 수 없다.
Insert, 데이터를 보내고 싶은 애플리케이션의 포트 번호를 알 수 있는 방법이 없기 때문에 자주 사용하는 서버 애플리케이션(Server Application)은 사전에 정해진 정보를 사용함으로써 서비스를 제공할 수 있도록 한다.
Insert, 이때 사전에 정해진 번호를 웰 노운 포트(Well Known Port)라고 하는데, 65536개의 포트 번호 가운데 1~1023번까지가 여기에 해당한다. 서비스를 제공하고 싶은 서버는 이들 번호를 애플리케이션에 할당하고, 송신처는 이 정해진 포트에 데이터를 보내는 것이다. 예를 들어 웹페이지를 보고 싶다면 80번 포트에 보내면 되는 것이다.

서비스를 제공하고 싶은 애플리케이션이 사용하는 1~1023번까지의 포트
포트 번호 애플리케이션
20 FTP 데이터
21 FTP 컨트롤
23 TELNET
25 SMTP
53 DNS
67 DHCP 서버
68 DHCP 클라이언트
69 TFTP
80 HTTP
110 POP3
161 SNMP 요청
162 SNMP 트랩
443 HTTPS
520 RIP

1024~49151번까지는 등록된 포트라고 부르는데 미리 등록되어 있는 포트 번호를 말한다. 이들은 이미 정해진 애플리케이션과 연결되어 있다. 송신하는 측의 애플리케이션은 이런 번호 이외의 49152~65535번까지의 번호 중에서 원하는 번호를 선택해서 사용한다. 이때 조건은 다른 애플리케이션이 사용하고 있는 번호를 사용해서는 안 된다는 것이다.

TCP의 단점
무엇을 하더라도 확인응답을 기다리는 시간이 필요하다. 때문에 전송 효율의 저하를 일으킬 수 있다.
아무것도 하지 않는 UDP
UDP의 헤더에는 시퀀스 번호도 확인응답 번호도 윈도우 사이즈도 제어비트도 없다. 포트번호 이외에 별다른 항목이 존재하지 않는다. 즉, 확인응답과 흐름제어가 없기 때문에 속도가 빠르다.
UDP 헤더
송신처 포트 번호(16비트) 수신처 포트 번호(16비트)
페이로드 사이즈(16비트) 체크섬(16비트)
UDP의 용도
UDP에서는 고속성, 즉 효율이 높다는 점을 살려서 고속성이나 실시간 송수신이 필요한 애플리케이션, 예를 들면 VoIP(Voice over IP)나 동영상 스트리밍 배포 등에 사용된다. 또한 브로드캐스트가 필요한 애플리케이션도 UDP를 사용한다.
Because, TCP에서는 동시에 복수로 송신하는 브로드캐스트와 같은 통신은 굉장히 어렵기 때문이다. 상대를 전부 알고 있어야 하고, 각각에 대해 커넥션을 확립하고자 하면 송수신이 많아지며, 각각에 사용하는 버퍼를 준비해야 하기 때문이다. 특히 상대가 있는지 없는지 모르는 DHCP 등은 커넥션을 취할 방법이 없다. 하지만 UDP의 경우 아무런 제어도 하지 않고 커넥션도 설정하지 않는다.

사설 IP 주소
보통 IP 주소는 ICANN이 관리하고 있다. 이건 인터넷에서 IP를 유일하게 관리하도록 하기 위해서이다.
Insert, 인터넷에서의 데이터 통신에 사용하는 IP 주소를 글로벌 IP 주소라고 하고, 인터넷에 연결하지 않는다는 조건으로 자유롭게 사용할 수 있는 주소를 사설 IP 주소라고 한다.  
=> 인터넷에 접속하지 않고 TCP/IP를 사용할 경우 사설 IP 주소를 사용하면 되고, 반면에 인터넷에서의 데이터 통신에는 글로벌 IP 주소를 사용해야 한다.

문제는 글로벌 IP 주소가 부족하다는 것이다. 이것의 해결 방법으로는 클래스리스 어드레싱이나 IPv6가 있다. 이외에 가장 간단하면서도 유효한 수단으로 사용되고 있는 것이 네트워크 주소 벼환(Network Address Translation)이다.
네트워크 주소 변환
먼저 내부 네트워크에는 사설 IP 주소를 할당한다. 사설 IP 주소를 할당하는 이유는 내부 네트워크 내에서 TCP/IP를 사용한 통신을 하기 위해서다. 그리고 NAT에 의해 내부 네트워크에서 할당한 사설 IP 주소를 글로벌 IP 주소로 변환하는 것이다.
1. 내부 네트워크(사설 IP 주소로 할당받고 있음)에서 인터넷(글로벌 IP 주소가 필요)에 송신한다. 라우터에는 ICANN과 하부조직에 의해 조직용으로 글로벌 IP 주소가 주어져 있다.
2. 라우터는 NAT를 수행해, 송신처 IP 주소의 사설 IP 주소를 글로벌 IP 주소로 변경해서 인터넷 수신처에 보낸다. 이 변경 사항은 기록으로 남는다(NAT 테이블에 저장).
3. 수신 받은 인터넷에 있는 서버는 응답을 한다. 물론, 이때 수신처는 변환 후의 글로벌 IP 주소이다.
4. 패킷을 수신한 라우터는 NAT 테이블에 따라 수신처 IP 주소를 사설 IP 주소로 변경해 내부 네트워크에 송신한다. NAT 테이블은 일정시간 후에 파기된다.

하지만 NAT에는 글로벌 IP 주소의 수만큼만 동시 접속할 수 있다는 문제가 있다.
Because, NAT에서 변환되는 주소는 유일해야 하기 때문에 보유하는 글로벌 IP 주소 수 이상의 호스트는 인터넷에 동시에 접속할 수 없다. 만약 글로벌 IP 주소 수 이상의 호스트가 인터넷에 동시에 접속할 경우 사설 IP 주소를 변환하려 해도 남아있는 글로벌 IP 주소가 없기 때문에 불가하다.
=> NAT를 발전시킨 NAPT가 존재한다.

NAPT
NAPT(Network Address Port Translation)는 IP 주소뿐만 아니라 포트 번호도 변환해서 하나의 글로벌 IP 주소로 복수의 컴퓨터를 접속 가능하게 한다.
1. NAPT는 NAT와 마찬가지로 IP 주소를 변환하지만, IP 주소를 변환할 때 포트 번호도 변환하고 그 대응을 NAT 테이블에 기재한다.
2. 응답의 경우, IP 주소와 포트 번호를 NAT 테이블에서 확인하고, IP 주소와 포트 번호를 변환한다.
NAPT는 NAT 테이블에 없는 변환은 변환되지 않기 때문에 내부 네트워크에 흐르지 않는다는 보안 상의 이점을 가지고 있다.
정적 NAPT
하지만 LAN 내부에서 외부로 공개하고 싶은 서버가 있을 경우 NAPT 테이블에 저장되어 있지 않은 것은 LAN 내부에 들어오지 못하기 때문에 문제가 된다.
=> 이를 해결하기 위해서 NAPT 테이블에 미리 변환을 저장한다. 이때는 수동으로 변환을 입력하는데 이것을 정적 NAPT라고 한다.
NAPT의 단점
또한 FTP와 관련해서도 단점을 가지고 있다. FTP에서는 IP 헤더에 수신처와 송신처의 IP 주소, TCP 헤더에 수신처와 송신처의 포트 번호가 사용되고, 데이터 부분에도 송신처의 IP 주소와 포트 번호가 기술된다. 이 데이터 부분에 있는 IP 주소와 포트 번호를 사용하여 FTP는 통신을 수행하는데, 이것이 사설 IP 주소 상태로 있으면 인터넷에서 사설 IP 주소 수신으로 데이터를 보내게 되니가 데이터를 보낼 수 없게 된다. 그래서 FTP에서의 데이터 전송을 불가능하게 된다. FTP 외에도 데이터 부분에 송신처의 IP 주소와 포트 번호가 기술되면 데이터 전송이 불가하다. 때문에 데이터 부분에 IP 주소가 들어가는 애플리케이션에는 개별적으로 대응한다.

5계층 : 세션계층
5, 6, 7계층은 TCP/IP의 경우 통합해서 하나의 프로토콜이 된 경우가 많다. 예를 들어 HTTP 등은 한 개의 프로토콜로 5, 6, 7계층의 역할을 수행한다.
5계층은 세션계층이라고 부르는데, 세션을 예로 들어 설명하자면, FTP는 2개의 커넥션을 사용해서 파일을 주고 받는데, 2개의 커넥션에 의해 사용자 인증부터 시작해서 디렉토리 정보, 파일교환, 교환 후의 디렉토리 정보, 그리고 다시 파일교환··· 이런 식으로 필요한 만큼의 파일 교환이 이루어진다. 이를 비유하자면, 2개의 커넥션에서 '패스워드를 보낸다', '데이터 전송 준비를 한다'는 등의 '말'을 주고받고 있는 것이다. 이 말을 주고받음으로써 파일전송을 한다는 대화를 성립시키는 셈이 된다. 그리고 이때 이러한 대화를 관리하는 것이 세션층의 주고받기이다. 여기서 대화의 관리란 대화가 성립하도록 제어를 하는 것을 의미한다. 이를 다이얼로그 제어(Dialog Control)라고 한다.
6계층 : 표현계층
TCP/IP에는 다양한 애플리케이션이 존재하는데 각각의 목적에 맞는 데이터 형식이 존재한다. 예를 들어 문자는 ASCII라는 데이터 형식이 가장 일반적이고, IBM 범용기에서는 EBCDIC라는 데이터 형식을 사용한다. 예를 들어 숫자 1을 비트로 나타내면 ASCII에서는 0110001, EBCDIC에서는 11110001이 된다. 이처럼 형식이 다르면 여러 가지가 다르기 때문에 상호 간 데이터 전송이 어렵다. 때문에 6계층에서 애플리케이션과는 동떨어진 데이터 형식의 전송을 위해 변환을 해서 하드웨어, OS 차이를 없앤 데이터 교환이 가능하도록 한다. 그 밖에도 6계층에서는 압축이나 암호화를 수행할 수도 있다.
7계층 : 응용계층
7계층은 애플리케이션의 목적에 따라 네트워크 서비스를 제공하는 계층으로 각각의 목적에 따른 프로토콜이 준비되어 있다. 각각의 프로토콜에 따라 송수신하는 데이터의 형식이나 순서 등이 정해져 있다. 애플리케이션에 있어서는 네트워크의 입구가 된다고 할 수 있다.

OSI 참조 모델
OSI 모델의 경우 7개의 계층으로 나뉘어 있고, 각각의 계층은 독립되어 있기에 각 계층을 독립하여 생각할 수 있다.
각 계층의 역할(상위 계층에 제공하는 기능 면에 중점을 두어…)
각 계층은 그 하위 계층의 상황을 신경쓰지 않는다.
순서와 기능을 전제로 구분하여 생각할 필요가 있다. 예를 들어 "케이블은 연결되어 있는데 데이터가 오지 않는다."는 문장의 경우, 신호를 주고 받는 기능과 데이터를 주고 받는 기능은 별개의 문제이고, 각각의 기능을 제대로 실현하지 않으면 올바르게 데이터를 주고 받을 수 없다는 것을 신경쓰지 않은 문장이다. 즉, 신호가 전해진다고 해서 데이터가 제대로 도달한다고 단정할 수 없는 것이다.

5~7계층은 4계층 이하에서 수행하는 처리에 따라 애플리케이션에 수신한 · 송신할 데이터에 대한 처리를 수행한다(서비스, 데이터 형식, 세션 관리 등). 7계층이 네트워크 서비스를 실시하고, 6계층이 데이터 형식을 변환하고, 5계층이 세션을 관리한다. 이들은 TCP/IP에서는 동일 프로토콜로 처리된다.

4계층은 3계층 이하의 기능으로 컴퓨터에 도달한 데이터에 대해 신뢰성이 높은 데이터 통신을 5계층에게 제공하는데, 애플리케이션을 식별하고, 각각에 대해 신뢰성이 있다 · 없다를 제공한다. 통신 애플리케이션의 식별은 포트 번호를 통해 이루어지고, 신뢰성이 있다 · 없다는 TCP를 사용하는지, UDP를 사용하는지에 따라 갈린다.

3계층은 2계층 이하의 기능에서 케이블에 접속된 기기 간의 데이터 통신을 사용해 다른 네트워크 간의 접속을 4계층에게 제공한다(어드레싱과 라우팅에 의해 인터넷 작업을 수행한다).

=> 4계층은 3계층에 의해 서로 다른 네트워크 간에서도 데이터 전송이 가능하게 되고, 3계층은 2계ᅎᅳᆼ 네트워크 내에서의 기기 간 데이터 전송을 통해서 네트워크 간의 접속을 수행한다.  

2계층은 1계ᅎᅳᆼ의 기능에서의 전기적인 데이터를 사용해서 서로 다른 기기의 데이터 송수신을 3계층에 제공한다. 즉, 2계ᅎᅳᆼ에서는 직접적인 데이터 전송 수행, 실질적인 데이터의 송수신과 제어(CSMA/CD)가 이루어진다. CSMA/CD를 통해 1계층의 전기신호 흐름에 있어서 충돌이 발생하지 않게 효율적으로 운영하고, 네트워크 내의 데이터 전송을 3계층에 제공한다.

1계층은 전기와 신호를 담당한다. 즉, 케이블과 신호를 2계층에 제공한다.

=> 즉, 하위 계층은 상위 계층에게 기능을 제공하고 데이터 전송을 수행하는 환경을 만들어 간다고 할 수 있다. 그리고 최종적으로 7계층이 애플리케이션에게 네트워크 서비스 그 자체를 제공하는 셈이 된다.