2022. 10. 7. 01:14ㆍ강의 내용 정리/풀스택서비스네트워킹
OSI Architecture(L4)
1. Transport 계층의 이해
1) 개념
(1) Process-to-Process Delivery
웹서버와 웹브라우저간의 속도 제어를 위한 흐름제어나 에러 검출을 하는 것이 Transport 계층의 핵심적인 내용이다. 하지만 이는 행동적인 측면에서 매우 중요한 부분이지만 어디로 가야하는 지에 대한 '주소'도 매우 중요한 요소이다.
1~2계층에서 바로 옆에 인접한 기기들과의 통신은 node-to-node 통신이라 할 수 있다. 멀리 떨어져있고, 중간에 여러 개의 기기가 있는 경우에는 host-to-host 통신이라 할 수 있다. 따라서 라우팅이 중요했던 3계층에서는 host-to-host라는 표현을 사용한다. 4계층에서는 한 컴퓨터에서의 프로그램의 주소값인 포트 정보가 중요해지기에 process-to-process 통신이라고 할 수 있다.
ip 주소는 랜카드에 설정한다. 보통 두 개의 랜카드가 존재해 ip 주소는 두 개 받을 수 있다. 이는 하나가 끊어지더라도 통신을 할 수 있게끔하기에 ip 주소를 두개 가지고 있는 이중화를 해놓는다. 또한 여기에서 가상화 작업을 하기 때문에 중간에 ip 주소가 달라지더라도 통신을 할 수 있게끔 한다.
(2) Client/Server Paradigm
Client: 요청하는 측
Server: 요청을 받는 측
Local host / Local Process: 보내는 자의 호스트, 프로세스
Remote host / Remote Process: 받는 자의 호스트, 프로세스
(3) Addressing
포트넘버는 16비트의 범위를 가지고 있다. 이 중 Well-known port number는 0부터 1023까지의 범위를 가진다. 이는 리저브라고 해서 리저브는 일반 프로그램이 건드리면 안되는 것들이다. 만약 다른 서비스와 포트넘버가 겹치게 되는 경우에는 서비스 간의 충돌 가능성이 있기 떄문에 대부분 이를 피해간다.
1~2 계층도 주소값을 가지게 된다. 이때 1~2계층은 공장에서부터 저장되어서 나온다. 스마트폰은 ip 주소, 와이파이주소(mac 주소), 블루투스 정보, 이동통신 기기번호 등등 가지게 된다. 1~2계층에서 통신을 할 때에는 mac 주소를 기준으로 통신한다. 이에 따라 다른 사람에게 보내져야하는 정보를 받을 수 있다.
(4) Connectionless vs Connection-Oriented Service
Connectionless
앞 뒤의 상관관계 없이 중간에 전달하는 기기는 패킷의 내용을 보고 전달한다. 따라서 헤더 정보만 보고 이를 처리한다.
ex) UDP
Connection-Oriented Service
논리적인 선을 만들어서 연결 설정을 진행한 뒤, 통신을 진행한 뒤에 연결을 해제하는 과정이 존재한다.
ex) TCP
(5) Reliable vs Unreliable
Reliable
에러 검출 및 복구를 하는 경우 Reliable이라 한다. TCP가 이에 해당한다.
Unreliable
에러 검출 및 복구를 하지 않는 경우 Unreliable이라 한다. UDP가 이에 해당한다.
Reliable한 서비스는 메모리나 부가적인 기능이 존재하니까 CPU 기능이 더 많이 사용되게 된다. 하지만 이론적으로는 그러하지만 성능적으로는 그렇지 않다. TCP의 경우에는 사람들이 많이 사용하기에 성능 개선이 많이 되었지만 UDP는 성능 개선이 많이 되지 않기에 큰 차이가 없다.
2) Multiplexing and Demultiplexing
3) Socket Addresses
Dotted된 주소를 헥사로 만들어서 이를 처리하는 경우가 많다. ip 위에서 프로그램을 하는 low 소켓을 하는 경우가 있고, 두 개의 기기를 연결해 통신을 할 때는 아래 계층에서 통신을 하는 경우도 존재한다.
4) Error control
트래픽이 한 줄에 몰려 유무선공유기의 버퍼의 사이즈 이상으로 트래픽이 넘어간다면 이는 버리게된다. 따라서 에러 검출이 필요하다.
5) Major Transport Layer Protocols
SCTP는 TCP의 성능을 개선하기 위해 만든 프로토콜로 통신회사에서 주로 사용한다.
2. User Datagram Protocol(UDP)
datagram은 네트워크에서 패킷을 처리할 때 패킷에 있는 정보만을 바탕으로 길을 결정하는 것을 의미한다.
1) UDP란?
패킷에 대한 정보만으로 통신을 진행하고, 연결이 없기에 이론 상 빠르지만 에러 검출을 하지는 않는다. 에러 검출 등의 일은 하지 않지만 주소값을 실어나르기에 process-to-process하도록 한다. 적정한 크기로 정보를 자르고, 포트 번호를 헤더에 넣어 정보를 만드는 역할을 한다.
(1) Well-known ports number
2) Frame format
- Source는 보내는 측, Destination은 받는 측이다.
- checksum은 보내는 정보에 대해 모두 더한 뒤, 나머지 값을 구해 자료가 맞는지 검증하는 내용이 된다.
- UDP의 가장 주요한 역할은 상대방 프로그래밍에 무언가를 전달하는 것에 있다. QUIC은 UDP 위에 설계가 되어있다. 이는 차후에 배울 예정이다.
3) Operation
에러 검출 및 흐름 제어 등의 작업은 없지만 헤더 정보를 추가하는 등의 작업은 존재한다.
4) Queuing in UDP
상위 계층의 정보는 하위 계층으로 보내기 전에 Queue를 사용해 이를 담는다. 하위 계층의 정보 또한 Queue에 담아 이를 상위계층에서 보낸다. 소켓의 경우에도 이와 마찬가지이다.
5) Applications of UDP
FTP(파일을 보낼 때 사용하는 것)와 같이 대량의 데이터를 보낼 때는 사용하기 힘들지만 TFTP(작은 파일)을 보낼 때는 사용하기 좋을 수 있다. 채팅 프로그램을 짜거나 할 때 세션방을 만들고, 그 방 안에 들어왔을 때 연결을 유지하고 있는지를 판단하기 위해 UDP를 개량해서 헬로우 프로그램을 짜서 보내기도 한다. 신뢰성을 어플리케이션이 보완한다면 UDP는 많이 사용한다. UDP는 멀티캐스팅이 불가능하다. 이는 교재와는 내용이 다르기에 참고하자.
3. Transmission Control Protocol(TCP)
흐름제어, 복구 등을 여기에 포함한다.
1) TCP Services
위에서 있었던 UDP와 비슷한 프로그램은 있지만 추가적인 프로그램도 존재한다.
2) TCP 관련 개념
(1) Stream Delivery Service
논리적으로 연결해 파이프를 뚫어서 바이트를 전달하기에 Stream이라고 표현한다. 예를 들어 프로그램에서 파일처리를 할 때 스트림을 사용한다. TCP에서 메세지를 보내기는 하지만 바이트를 전송한다는 개념이 제일 중요하다. 파이프를 만드는 연결과정, 파이프를 없애는 해제과정이 매우 중요하다. 프로세스와 운영체제는 버퍼를 두는 폴링 방식을 사용하는 경우가 많다.
(2) Sending and Receiving Buffers
통신에서 버퍼를 사용하는 경우에는 circular queue를 사용하는 경우가 많다. sent는 보냈는데 아직 응답을 받지 못한 경우이다. 이는 바이트단위로 처리한다. 받는 경우에는 받아서 저장하는 것과, 받았는데 아직 receive process에 전달하지 못한 것밖에 없다. 재전송을 하지 않기 때문이다.
(3) Segment
TCP의 Segment가 존재하나 Segment에 부여하는 번호는 없다. 세그먼트에는 바이트들과 헤더가 존재한다.
(4) Full Duplex Service
메세지를 보내면서 받을 수 있다. 메세지를 받는 경우에는 ack를 전송해야한다. 만약 내가 전송하고자 하는 메세지가 있을 때에는 상대방에게 내가 보낼 ack 메세지를 같이 보내는 경우도 있다. 이와 같이 데이터를 보낼 때에는 헤더를 보내는 빈도가 줄어들기에 통신 효율이 증가한다. 통신에서의 효율은 메세지의 사이즈가 아닌 초당 메세지를 몇 개 처리할 수 있는지에 달려있다. 따라서 초당 메세지를 얼마나 받는지가 성능의 중요한 지표가 되기에 ack 메세지를 메세지와 함께 보내는 것이 중요하다.
(5) Piggybacking
내가 보낼 긴 메세지 뒤에 소량의 ack 메세지를 함께 보낸다. 이러한 방식은 미국식 방식이다.
cf) Connection-Oriented, Reliable Service
Connection-Oriented Services와 Reliable Service은 TCP의 주요 특징이다.
연결 설정을 해서 뚫는 길은 virtual path라고 표현하기도 한다.
(6) Byte numbers
- TCP 앞에는 바이트에 대한 순서를 명시한다. 즉, 바이트를 전송할 때 이를 잘게 쪼개서 전송하게 되는데, tcp 패킷의 정보의 번호를 매겨서 이를 처리한다.
- 최대 시퀀스 넘버는 2의 32승 - 1이다. 해당 번호를 가지고 에러 검출을 한다.
(7) Sequence number
첫번째 바이트의 숫자를 넣어준다. 보낼 때에는 시퀀스 넘버가 들어간다. ack 메세지를 보낼 때에는 next to receive 번호를 전달한다.
(8) Control Field
- 각각의 기능은 1비트로 처리를 한다. 1이면 켜져있는 것, 0이면 꺼져있는 것을 의미한다.
- SYN은 연결설정 요청을 하는 것이다.
- FIN은 연결설정을 해제하는 것이다.
- ACK는 데이터를 잘 받았을 때 보내주는 것을 의미한다.
- RST는 비정상적으로 동작하여 에러가 많이 발생하고, 통신이 안될 때 초기화하는 것을 의미한다.
3) 연결설정 과정
full duplex이기는 하지만 한번의 연결설정을 통해 서로 연결을 하는 것처럼 보이지만 사실 이는 독립적이고, 동시에 연결을 하는 경우에는 연결요청을 받는 쪽에서 연결 요청과 ack 메세지를 중간에 동시에 보낸다는 특징이 있다.
tcp는 보안이 중요하기에 랜덤넘버를 생성해 seq 번호를 지정한다. ack는 받은 seq의 번호 + 1로 설정해 보낸다.
Syn Flooding Attack은 Syn 요청을 매우 많이 보내 서버를 죽이는 방법이다. firewall가 이를 막는다.
받은 메세지가 없는 경우에는 ack 메세지가 변하지 않는 것을 확인할 수 있다.
4) Data transfer
(1) Pushing Data
버퍼에 넣을 시간 없이 빨리 밀어내는 경우를 Push라고 한다.
(2) Urgent Data
긴급하게 보낼 때 사용한다. 하지만 이와 push는 대부분 사용하지 않는다.
(3) Half close
둘이 동시에 연결해제를 하지 않는 경우이다. 이러한 경우에는 일방향으로 데이터를 전송하고, 한쪽에서는 데이터의 ack를 보내게된다.
5) 흐름 제어 및 에러 검출/복구
(1) 흐름 제어
sending 버퍼와 receiving 버퍼가 있다. 수신단의 버퍼를 r window라고 한다. SYN 메세지가 서버에게 도착하면 연결설정을 한다. 상대방으로부터 오는 메세지의 세그먼트는 rwnd 사이즈만큼 저장할 수 있다. 해당 예제에서는 800만큼 받을 수 있다. 만약 이 사이즈를 넘어가면 버릴수밖에 없기에 가용공간만큼 데이터를 송신할 수 있다. 따라서 송신단은 rwnd보다 작게 사이즈를 설정한다. 서버로부터 ack메세지를 받으면 메세지를 재전송할 필요가 없으니 이를 날린다.
속도를 올리기 위해서는 수신버퍼의 크기가 커져야한다. 하지만 seq num의 제약을 받아 수신버퍼의 크기가 제한된다. 따라서 이동통신 속도가 올라가더라도 속도의 한계가 있다.
(2) 에러 검출
Normal operation
데이터를 받을 때에는 타이머를 돌려서 일정 시간이 지난 뒤, ack를 보낸다. 다시 말해 ack를 딜레이해서 송신한다. 그 딜레이된 시간 내에 다른 데이터를 수신하는 경우에는 이를 합쳐서 ack 번호를 보낸다. 이는 데이터를 보낼 일이 없을 때 ack만 보내야하는 경우에 위와 같이 한다. 이에 따라 수신단의 rwnd를 늦게 알 수 있게된다.
Lost Segment
중간에 데이터가 유실된 경우에는 순서가 뒤바뀌었기에 아직 데이터를 받지 못했다고 ack 메세지를 재전송한다. 이미 받은 데이터는 따로 저장한다. 타이머의 시간이 지나더라도 ack를 받지 못한 경우에는 메세지를 재전송하게 된다.
Fast retransmission
수신단에서 해당 옵션을 켜면 순서가 뒤바뀌었을 때 ack메세지를 계속 보낸다. 송신단에서는 해당 옵션을 켜면 재전송 ack가 연거푸 세번 왔을 때 ack에 대한 데이터를 전송한다.
Lost acknowledgement
메세지를 보냈을 때 timer를 켜지만 ack를 받지 못하고 timer가 터지면 재전송을 한다. 만약 ack를 보낼 때 유실이 되었더라도 이후에 timer가 터지기 이전에 메세지에 대한 ack를 받게된다면 괜찮다.
3) 흐름 제어
(1) Slow start, exponential increase
처음 연결설정을 한 뒤에는 메세지를 하나만 보낸다. 응답을 제대로 받은 뒤에는 cwnd를 두배로 키워가며 데이터를 전송한다. 즉, 메세지를 보낼 때에는 수신단의 버퍼도 확인하지만 exponential하게 메세지를 보내는 것도 고려하여 이를 보낸다.
(2) Congestion avoidance
하나씩 데이터를 늘려가며 전송한다.
(3) Example of Taho TCP
x축은 시간, y축은 cwnd이다. 에러가 발생해 time-out이 나면 처음부터 다시 시작한다. 에러가 발생하기 전까지 메세지는 2배씩 올려가며 데이터를 전송하지만 에러가 발생한 이후에는 데이터의 사이즈를 하나씩 증가시켜가며 데이터를 전송한다.
연결되어있는 줄의 상태를 알 수 없기에 에러가 발생해 데이터가 유실되면 데이터를 확 줄이는 동작을 한다.
(4) Reno TCP
성능이 좋아지기는 했지만 확 좋아지지는 않았다.
(5) Additive increase, multiplicative decrease
통계적 다중화를 통해 성능 개선을 만든다.
원거리에서 지역적으로 멀리 떨어지는 경우에는 혼잡제어에 대한 매커니즘은 합리적이다. 하지만 데이터 센터가 설치되고, 바로 옆에 있는 컴퓨터 간의 통신을 하는 경우라면 이와 같이 설계하는 것은 비효율적이다.
tcp에서 성능 개선을 하기 위해 링크를 여러개 만들어서 데이터를 나눠서 전송하는 방법도 있다.
ex) 실시간의 영화를 볼 때는 TCP, UDP 둘 중 어떤 것을 선택하는 것이 좋을 것인가.
링크의 속도가 버벅거리는 경우에는 서버가 보내는 속도를 화면에서 보는 속도를 따라잡지 못해, 큐에 들어가있던 데이터가 버려지게 되는 것이기에 TCP를 사용한다면 에러 검출 및 복구를 할 수 있기에 깔끔하게 볼 수 있다.
'강의 내용 정리 > 풀스택서비스네트워킹' 카테고리의 다른 글
풀스택 서비스 네트워킹, 구글은 크롬을 왜 만들었을까? (0) | 2022.12.04 |
---|---|
풀스택 서비스 네트워킹(6), HTTP/1.1 (1) | 2022.10.18 |
풀스택 서비스 네트워킹(5), ZeroMQ (0) | 2022.10.13 |
풀스택 서비스 네트워크(4), Socket (0) | 2022.10.11 |
풀스택 서비스 네트워크(2), OSI Architecture(L1~L3) (1) | 2022.09.30 |