- toc {:toc}
Notice
Computer Networks 글은 경희대학교 소프트웨어융합대학 이성원 교수님의 [컴퓨터 네트워크 CSE302] 수업을 기반으로 정리한 내용입니다.
Transport Layer Basic
- TCP, UDP
Process-to-Process Delivery
- 2계층 링크 계층은 두 노드를 하나의 링크로 연결하여 프레임을 전달하는, Node-to-Node 전달이 이뤄졌다.
- 이전 2개 이상의 줄, 3개 이상의 기기들을 연결한 것이 네트워크라고 말했고, Host-to-Host 전달이 이뤄졌다.
- Transport(이하 트랜스포트) 계층은 Process-to-Process 전달이 이뤄진다. 이때 Process는 프로그램을 말한다.
- 컴퓨터와 컴퓨터 사이에 전송을 보내는 것이 아니라, 송신 컴퓨터 안의 프로그램 중에 Source 프로그램이 있고, 수신 컴퓨터 안에 Destination 프로그램이 있어, 둘 사이를 오고 간다.
- 메시지의 부분, 즉 패킷을 전송한다.
- 두 프로세스는 클라이언트-서버 관계로 통신한다.
Client/Server Paradigm
- 대부분의 Process-to-Process 통신은 클라이언트/서버(Client/Server) 구조를 갖는다.
- 클라이언트 : Local host의 프로세스
- 서버 : 서비스를 제공하는 remote host의 프로세스
- 클라이언트, 서버 두 프로세스는 모두 같은 이름을 갖는다.
- day time Client process
- day time Server process
Addressing
- 2계층 데이터 링크에서 프레임은 MAC 주소가 필요
- 3계층 네트워크에서 IP 주소 필요
- 4계층 트랜스포트에서 트랜스포트 계층 주소, 포트 번호가 필요하다.
- 포트 번호(Port Number) : 0~65,535(16비트 정수)의 범위에서 선택하여 프로세스에게 할당한다.
- Well-known 포트 번호 : 0~1023 표준화된 포트 번호 범위(예약은 주로 서버를 지정한다.)
- Ephemeral 포트 번호 : 소프트웨어가 랜덤하게 선택해 사용하는 포트 번호
- Daytime 정보를 가져오려 한다면
- 서버에게 정보를 요청하려 한다.
- 클라이언트의 운영체제가 소프트웨어에게 가능한 포트 번호 값 중 0~1023 값이 아닌 포트 번호(52,000)를 할당해준다.
- 해당 포트 번호를 통해서 통신한다.
- IP 주소와 포트 번호의 차이
- 수많은 장치와 줄들로 인해 연결되어 있는 경우 컴퓨터와 컴퓨터 사이를 IP 주소를 사용하여 통신한다. 호스트-IP
- 컴퓨터 내부의 프로세스에 대해 찾아가는 것은 포트 번호를 통해 찾아간다. 프로세스-포트 번호
- Source IP Address, Source Port Number, Destination IP Address, Destination Port Number 4가지가 있다면 어디든 통신이 가능하다.
Socket Address, Multiplexing and Demultiplexing
-
소켓(Socket) : IP 주소와 포트 번호의 조합을 의미한다.
-
4계층 이상에서 프로그램을 다루는 경우 포트 번호만으로는 호스트를 찾아 통신할 수 없기 때문에 IP 주소와 포트 번호를 함께 묶는 소켓이라는 이름으로 묶어 사용한다.
-
Multiplexing and Demultiplexing
- 수많은 프로세스가 작동될 때 하나의 IP 주소를 통해서 통신한다.
- 여러 프로세스들이 묶여 하나의 IP로 통신하는 것을 Multiplexing이라 하고 하나의 IP로 전달되어 각 프로세스로 전달되는 것을 Demultiplexing이라 한다.
Connectionless VS Connection-Oriented Service
-
Connectionless Service
- 연결 설정 해제 과정이 없다.
- 가장 유명한 Connectionless Protocol은 UDP이다.
-
Connection-Oriented Service
- 먼저 송신자와 수신자 사이의 연결 설정을 하고 통신을 하는 것을 말한다.
- 가장 유명한 Connection-Oriented Protocol은 TCP이다. + SCTP
-
Reliable
- 신뢰성이 있는 전송을 위해서 TCP, SCTP 같은 프로토콜을 사용한다.
- 느리고, 더 복잡하다.
- Application 계층의 프로그램이 신뢰성이 필요하다면 프로토콜도 신뢰성있는 프로토콜을 사용해야 한다.
- 병목 현상이 나올 가능성이 높기 때문에 보장할 수 있는지 잘 생각해봐야 한다.
-
Unreliable
- 신뢰성이 중요하지 않다면 UDP 같은 프로토콜을 사용한다.
- 흐름, 오류 제어가 필수적이지 않은 서비스이거나 속도가 빨라야 하는 서비스인 경우 사용한다.
- 프로그램만의 고유한 흐름, 오류 제어 매커니즘을 사용해 신뢰성이 필요하지 않을 때 사용한다.
-
데이터 링크 계층에서 신뢰성이 있고 흐름, 오류 제어가 가능하다 하더라도 트랜스포트 계층에서 신뢰성 제어가 필요할까?
- 필요하다. 왜?
- 네트워크 계층에서도 언급했다시피 한 곳에 너무 많은 패킷이 몰릴 경우, 한 번에 전송할 수 없고, 버퍼에 보관하다가 전송해야 한다. 이때, 일정 시간이 지나면 데이터를 날리는 방식을 사용하기 때문에 데이터 손실이 발생한다.
- 네트워크 계층은 빠르게 전달하기 위해 신뢰성이 보장되지 않은 경우가 대부분이므로 트랜스포트 계층에서 신뢰성 보장을 신경써야 한다.
- 분홍선과 같이 1, 2계층의 연결을 통해서 오류 검출, 신뢰성을 보장한다 하더라도 장치 안에서 발생가능한 손실이 있을 수 있고, 신뢰성을 최대한 보장하기 위해서 트랜스포트, 4계층에서도 신뢰성 보장을 신경써줘야 한다.
User Datagram Protocol (UDP)
-
UDP : Connectless, Unreliable transport protocol
-
Host-to-Host 대신 Process-to-Process를 제공하는 것을 제외하고 IP의 서비스에 어떠한 것도 추가하지 않았다.
-
UDP는 신뢰성을 보장하지 않아도 되는 작은 메시지를 전송할 때 사용한다.
-
작은 메시지를 전송하며 TCP를 사용하는 것보다 송수신 관계에서 적은 통신을 할 때 사용한다.
-
Connectionless Services : 연결 설정 없이 각 datagram은 독립적이다.
-
Flow and Error Control : 흐름, 오류 제어 매커니즘이 없다.
-
Encapsulation and Decapsulation : IP datagram에서 캡슐화, 분해한다.
-
Well-known ports used with UDP
- UDP Frame format
- UDP 프레임은 어느 프로세스가 전송하고 어느 프로세스가 받아야 하는지에 대한 정보 전달이 가장 중요하다.
-
항상 서버가 클라이언트보다 먼저 동작하고 있어야 한다.
-
클라이언트 측면 동작
- 프로세스가 시작하면 포트 넘버를 OS에 요청한다.
- 클라이언트 프로세스가 메시지를 outgoing 큐에 source 포트 번호를 사용해 메시지를 보낸다.
- UDP 헤더를 추가한 후 큐의 메시지를 지우고, IP로 전달한다.
- Outgoing 큐가 오버플로우될 수 있는데, 이럴 경우 OS는 클라이언트 프로세스에게 보내지 말고 대기시킨다.
- 메시지가 클라이언트에 도착하면 UDP는 incoming 큐를 확인하고 메시지가 있는 경우 목적지 포트 넘버를 확인하고 해당 프로세스로 전달한다.
- 서버 측면 동작
- 시작하면 서버는 특정 포트를 설정해 incoming, outcoming 큐를 요청한다.
- Incoming 큐에 메시지가 도착하면 UDP는 목적지 포트 번호에 맞는 포트로 데이터를 전달한다.
- 서버가 응답하길 원할 때 메시지를 포트 번호와 함께 outgoing 큐로 보낸다.
- Applications of UDP
- FTP와 같이 파일 전송의 신뢰성이 필요한 경우 사용하면 안된다.
- TFTP의 경우(작은 데이터) 간혹 사용된다.
- Multicasting이 오류 검출, 복구를 하기 힘든 경우 사용
- 라우터간의 정보를 파악할 때 사용한다.
- SNMP와 같이 관리하는 프로세스에 사용된다.
Transmission Control Protocol (TCP)
-
TCP : Connection-Oriented Protocol
-
논리적인 연결을 만들고, 흐름, 오류 제어 매커니즘을 사용한다.
-
Connection-Oriented Service : 연결 설정 후 데이터를 주고 받고 전달이 끝나 버퍼가 비어있다면 버퍼를 파괴한다.
-
Reliable Service : ACK 매커니즘을 사용해 데이터의 도착을 확인하고 보장한다. Selective Repeat 매커니즘과 비슷
-
Stream Delivery Service
- TCP는 stream-oriented protocol이다.
- 두 프로세스가 데이터를 전달할 수 있는 튜브로 연결한 것과 같이 연결된 것을 말한다.
- 2계층의 데이터 링크를 생각해보면 메시지를 패킷으로 쪼개 1번, 2번으로 번호를 통해 구분해 전송했는데, TCP는 바이트를 세어 전송한다.
-
송신, 수신 프로세스의 데이터 생성과 소비가 같은 속도로 발생하지 않는 경우가 대부분이기 때문에 TCP는 저장을 위한 버퍼가 필요하다.
-
송신, 수신 버퍼는 순환 큐를 사용한다.
-
바이트 단위(세그먼트 그림에서 분홍색)로 보낸다는 것이 중요하다.
-
세그먼트(Segments)
- 트랜스포트 계층에서 TCP는 패킷에서 많은 바이트를 같이 묶는데, 이를 세그먼트라고 한다.
- TCP는 각 세크먼트에 헤더를 추가하고 3계층으로 전달하여 전송한다.
- 세그먼트들은 IP datagram에서 캡슐화되고 전송된다.
- 순서가 다르거나, 손실, 변형된 세그먼트를 받을 경우 재전송한다.
-
Full-Duplex Service
-
TCP는 full-duplex 서비스를 제공한다. 동시에 데이터를 전송하고 수신할 수 있다.
-
Piggybacking : A에서 B로 패킷을 보낼 때 수신했다는 ACK를 붙여 전송하는 것
Byte numbers
-
TCP는 세그먼트 번호를 쓰는 필드가 없다. 대신에 sequence 번호, ack 번호를 사용한다.
-
각 연결에서 전송되는 모든 데이터 바이트는 TCP에 의해 번호 매겨진다.
-
번호는 랜덤하게(보안 측면) 생성된 번호를 통해 매겨지고, 첫 바이트의 번호 범위는
이다. -
만약 내가 6000바이트를 보내고 싶고 랜덤하게 생성된 첫 바이트의 번호가 1057이라 하면 바이트는 1057~7056으로 번호가 매겨진다.
-
바이트 번호는 흐름, 오류 제어를 위해 사용된다.
-
Sequence Number
- 바이트의 번호가 매겨진 후 TCP는 전송될 각 세그먼트에 seq 번호를 할당한다.
- 세그먼트 번호는 세그먼트에서 첫 번째 바이트의 번호이다.
-
Acknowledgment Number
- 세그먼트에서 Ack field 값은 받을 예정인 바이트 그룹의 다음 바이트의 번호로 정의된다.
- Ack 번호는 축적된다.
-
TCP Segment format
- Control field
- SYN : 연결 설정 요청을 할 때 사용된다.
- FIN : 연결 해제 요청을 할 때 사용된다.
- RST : 복구 불가한 경우 연결을 초기화한다.
- ACK : 잘 수신했는지를 파악하기 위해 사용한다.
TCP is Connection-Oriented
- Source와 Destination 사이에 물리적인 길이 아닌 가상의 길을 만든다.
- 가상의 길을 통해 메시지에 속하는 모든 세그먼트를 전송한다.
- 하나의 가상의 길을 사용하는 것을 통해 손상되고 손실된 프레임을 재전송하는 것 뿐만 아니라 ACK 프로세스를 용이하게 한다.
- TCP는 개별 세그먼트를 전송하는 IP의 서비스를 사용하나, 연결 자체를 제어한다.
Connection Establishment
- 연결 과정
- 클라이언트가 연결 요청을 보낸다. 이때, SYN flag가 1이다.
- 서버는 연결 요청에 대한 ACK를 전송한다. TCP는 반만 열 수 있기에 서버도 SYN flag를 1로 설정해 연결 요청을 보낸다.
- 클라이언트에서 연결 요청에 대한 ACK를 전송한다.
- Seq 번호, 8000과 15000은 랜덤 번호로 설정되어 전송된다.
- 동시 연결
- 두 프로세스가 연결 활성화 요청을 보냈을 때 동시 연결이 발생한다.
- 두 TCP는 SYN+ACK 세그먼트를 서로에게 전송하여 하나의 연결을 설정한다.
- SYN Flooding Attack
- SYN Flooding Attack은 악의적인 공격자가 다양한 클라이언트로부터 전송된 것처럼 가짜 source IP 주소를 설정해 SYN 세그먼트를 서버에 대량으로 전송하는 경우를 말한다.
- 이 경우 버퍼에 많은 세그먼트를 저장하고 처리해야 하기 때문에 실질적인 메시지는 처리하지 못하고 불능 상태가 된다.
Full-Duplex Data Transfer
-
Full-Duplex 데이터 전송
- 바이트의 시작 번호로 seq 번호가 설정되어 전송된다. Ack 번호는 이전 연결 설정으로 설정된 번호가 그냥 들어온 것이다.
- 두 세그먼트가 들어왔기 때문에 서버에서 보내는 세그먼트는 클라이언트로부터 전송된 마지막 바이트 번호에 +1한 10001을 Ack로 설정해 보낸 것을 확인할 수 있다.
- 서버에서도 데이터를 전송해 바이트가 15001-17000으로 전송했기 때문에 클라이언트에서 Ack 17001로 설정해 세그먼트를 전송한다.
-
Pushing Data
- 상위 계층에서 하위 계층으로 데이터를 전송해달라고 요청할 때 하위 계층에서는 데이터를 받자마자 바로 전송하는 것이 아니라 윈도우가 모두 찰 때까지 기다렸다가 전송한다.
- 하지만 Application 프로그램이 push 동작을 요청하면 TCP는 윈도우가 찰 때까지 기다리지 않고 바로 세그먼트를 만들고 전송한다.
-
Urgent Data
- 송신하는 Application 프로그램이 URG 비트를 설정하여 전송하고 수신하는 TCP가 URG 비트가 있는 세그먼트를 받았을 때 urgent 데이터를 추출해 제일 먼 수신 Application 프로그램으로 전달한다.
- 실제로 사용되는 사례는 드물고 이렇게 급한 경우 UDP를 사용하여 전송하는 방식이 주로 사용된다.
Connection Termination
- 연결 해제
- FIN flag를 통해 서로의 연결 해제를 요청한다.
- 한 쪽만 연결을 해제한 경우
- 클라이언트에서 연결을 해제한 경우 서버는 클라이언트에게 계속해서 데이터를 전송할 수 있고, 클라이언트는 연결을 해제하더라도 ACK는 계속 전송할 수 있다.
Flow Control
- 흐름 제어 예시
- 1번, 2번, 3번 - SYN, ACK를 전송함으로써 연결 설정을 한다. 이때, 서버는 Seq 번호를 100으로 받았기 때문에 101부터 받기를 기다리며 버퍼 크기(800)을 설정하여 받을 수 있는 정도를 클라이언트에게 알려준다.
- 4번 - 101의 Seq 번호로 데이터를 200바이트 전송한다. 서버는 데이터를 받고, 받을 수 있는 버퍼는 600바이트로 줄어든다. (버퍼에 있는 데이터를 바로 처리하는 것이 아니라 여유가 있을 때 처리할 수 있기 때문에 바로 받을 수 있는 버퍼의 크기가 증가하지 않는다.)
- 5번 - Ack와 받을 수 있는 버퍼의 크기를 전송한다. 클라이언트는 Ack를 받았으므로 수신한 버퍼의 내용을 지우고, 전송 윈도우 크기는 유지한다.
- 6번 - 300바이트 데이터, Seq 번호를 전송한다. 서버는 100바이트를 처리한 상태이고 300바이트를 버퍼에 저장해 버퍼에서 받을 수 있는 크기는 400바이트가 된다.
- 이후 처리한 만큼 서버의 버퍼가 증가한다.
Normal Operation and Error Control
- Ack delaying timer를 설정해 타이머동안 세그먼트를 기다리고, 이후 들어온 세그먼트를 모두 고려해 Ack를 전송한다.
- 단점
- 응답이 바로바로 오지 않기 때문에 대량의 데이터를 전송해야 하는 경우 통신 효율이 떨어진다.
- 빨리 Ack를 받아야 하는 긴급한 데이터의 경우에 응답을 바로 받을 수 없다.
- 세그먼트를 잃어버린 경우 순서가 맞지 않고, 이 경우 오지 않은 701 Seq 번호를 Ack 번호로 설정해 전송하여 클라이언트에서 재전송할 수 있도록 한다.
- 재전송도 타이머가 끝나야 이루어진다.
- Fast retransmission
- TCP가 보내야 할 데이터가 많아지고 사용되는 목적이 조금 변형되며 추가됐다.
- 대량의 데이터를 전송하면서 받지 못했다는 동일한 Ack를 타이머가 작동하는 동안 3번 받는 경우 해당 데이터를 재전송하고 타이머를 재시작한다.
- 중간의 Ack가 손실되고 타이머가 끝나기 전에 Ack를 전송 받은 경우 클라이언트 입장에서는 중간의 손실이 크게 상관없다. (Ack도 901로 전송되었기 때문)
- 타이머가 끝날 때까지 Ack가 오지 않으면 재전송을 진행하고, 해당 Ack를 재전송받아 처리한다.
Unique TCP Control
Slow start, exponential increase
- 서로를 연결하는 물리적인 줄이 어디에는 있을 것이지만, 물리적인 줄을 서로 공유해서 사용하고, 트랜스포트 계층은 네트워크 계층이 어떻게 동작되고 있는지를 알지 못하기 때문에 과도한 부하를 주지 않기 위해 만들어진 방식이다.
- 연결 설정을 하고 첫 번째 데이터를 전송하는 순간부터 적용된다.
- 서버의 윈도우 크기가 크다면 클라이언트는 큰 데이터를 한 번에 보낼 수 있는데, 한 번에 많은 데이터를 전송할 경우 서버에 부하를 줄 수 있다.
- 때문에 서버의 윈도우 크기와 상관없이 클라이언트의 전송 정도를 조절한다. 즉, 처음에는 하나의 세그먼트만 전송할 수 있다. Conjestion 윈도우를 Receiver 윈도우보다 높은 우선순위로 설정해 작동시킨다.
- Ack가 서버로부터 올 때까지 클라이언트는 하나의 세그먼트만 전송한다.
- Ack를 받은 경우 Conjestion 윈도우 x 2 만큼 보낼 수 있다.
Conjestion avoidance, additive increase
- rwnd가 크더라도 cwnd에 따라 동작한다.
- 지수로 증가하는 것이 아니라 선형으로 증가한다.
- Taho TCP의 예시
- Y축이 Conjestion window
- Slow start로 진행하다 Time-out(오버플로우, 지연으로 인해 전송되지 않은 경우)가 발생
- 다시 1로 떨어뜨리고 Time-out한 cwnd의 절반을 Threshold level로 설정한다.
- Slow start를 하고 Th에 도달한 경우 Conjestion avoidance를 사용해 선형으로 증가시킨다.
- 3dupACKs가 발생하면 다시 1로 떨어뜨리고 Th를 재설정한다.
- Reno TCP
- 오류는 드문드문 발생하는 경우가 많다. 3dupACKs가 발생한 경우 이전에는 계속해서 작동한 것이기 때문에 살짝 낮춰서 전송하고 Ack가 오면 ssthresh로 낮춰 다시 올린다.
참고문헌
- Textbook: Behrouz A. Forouzan, “Data Communications and Networking, 5th Edition”, McGraw-Hill Companies, Inc.