prime 2024. 4. 10. 21:01

1. Introduction

 

Transport layer는 traffic이 특정 network application으로 가도록 한다. 

transport layer는 multiplexing을 통해 하나의 process로부터의 traffic을 하나의 node에서 전달할 수 있도록 한다. 반대로, demultiplexing을 통해 하나의 node로 도착한 traffic을 여러 receiving service로 전달되도록 한다.

Port는 특정한 service로 traffic을 보내기 위해 사용되며 16bit 숫자이다. 예를 들자면, client에서 10.1.1.100 IP로 웹브라우저를 이용해 웹페이지를 요청했을 때, server의 80번 port로 해당 request는 전달된다.이러한 경우 10.1.1.100:80 과 같이 표현할 수 있는데, 이것을 socket address 또는 socket number이라고 한다. 이러한 방식을 이용하면 단일컴퓨터에서 여러가지 서비스를 호스팅할 수 있다. 

 

2. Dissection of TCP segment

 

IP payload는 TCP segment이다. TCP segemt는 header, payload로 이루어져있다. 

 

출처 : wikipedia

 

TCP Header에는 굉장히 많은 정보가 있다. 

Source port는 ephemeral ports라고 불리는 특별한 ports들 중에서 선택된 high-numbered port이다.

Destination port은 traffic이 도착하는 port이다. 

Sequence number은 32bit로 TCP segment들의 순서를 가리킨다. Ethernet frame이 일반적으로 크기가 1518byte로 제한되기 때문에, 그보다 훨씬 많은 데이터를 전달해야할 경우 여러 TCP segment로 나누어 데이터를 전송하기 때문이다.

Acknowledgement number은 다음에 받을 것으로 예상되는 segment의 sequence number이다. 예를 들어, 2로 설정되어 송신하면 수신측에서는 다음 segment의 sequence number를 2로 설정하여 응답한다.

Data offset number은 4bit의 TCP header의 길이를 나타내며, 이를 통해 어디서부터 TCP segment의 data payload부분이 시작되는지 알려준다. 

Reserved는 0으로 모두 설정되어, 이는 미래의 사용을 위해 예약되어 있다. 

Control FLG URG, ACK, PSH, RST, SYN, FIN 이 있다. RFC 3168에서 CWR, ECE가 혼잡제어를 위해 추가되었다.

Window size는 16bit로 sender가 receiver로부터 Acknowledgement를 요구하기 전에, sender가 보낼 수 있는 sequence number의 범위를 지정한다. 이를 통해, 만약 receiver의 buffer크기가 작다면, receiver는 ACK에 window size를 감소시켜 보내고, 다음 sender의 전송에 더 적은 data를 송신하도록 함으로서, sender가 실제로 buffer가 가득참으로 인해 수신되지 않을 데이터를 전송하는데 시간을 낭비하는 것을 막기 위함이다.

Checksum field는 16bit로 IP checksum과 유사한 방식으로 계산된다. 수신측에 도착했을 때 다시 계산되어 TCP segment의 integrity를 검증한다. 매 router를 거칠 때마다 checksum이 계산되는 IP checksum과는 다소 다르다. 

Urgent pointer는 16bit로 TCP control FLG 중 하나와 사용되어, 더 중요한 특정 segment가 무엇인지 알려준다. 이것은 아직 채택된적이 없고, 현대 networking에서는 볼 수 없을 것이다.

Option field는 실제로는 거의 사용되지 않지만, 간혹 복잡한 flow control protocol에서 사용되기도 한다.

마지막으로, padding은 0으로 header의 끝을 채움으로서, data payload section이 올바른 위치에서 시작될 수 있도록 한다. 

 

3. TCP Control Flags & 3-way Handsake

 

주로 사용되는 TCP Control Flag는 총 6가지가 있다. URG, ACK, PSH, RST, SYN, FIN이다.

URG는 segement가 긴급한 것이고, urgent pointer에 그것에 대한 추가정보가 있음을 알려준다. 실제로는 거의 볼 수 없다.

ACK는 Acknowledgment number field를 반드시 검사해야함을 의미한다.

PSH(push)는 수신측에 현재 buffered된 데이터를 가능한한 빨리 application에 push해야함을 의미한다. 이것은 매우 작은 데이터를 보내고, 그것에 대한 응답을 가능한한 빨리 받고 싶을 때 사용한다. 

RST(reset)은 TCP connection의 한쪽이 누락되거나 잘못된 segment를 복구할 수 없음을 의미한다. 무슨 말인지 이해못해서, 다시 처음부터 시작하자는 말과 같다. 

SYN(synchronize)은 TCP connection을 처음 맺으려고 함을 의미하며, receiving end가 sequence number을 검사하도록 한다. 

FIN(finish)는 sending end가 더이상 보낼 데이터가 없어 connection을 끝내고자함을 의미한다. 

 

1) TCP Connection

처음 TCP연결을 맺기 위해서는 3-way Handshake라는 다음과 같은 과정이 필요하다.

- Computer A에서 먼저 SYN을 설정하여, TCP segment를 보낸다. 연결할 준비가 되었는지 물어본다. 

- Computer B에서 이에 대한 응답으로 SYN+ACK을 설정하여, TCP segment를 보낸다. 연결할 준비가되었다고 하고 동시에 연결할 준비가 되었는지를 물어본다.

- Computer A에서 이에 대한 응답으로 ACK을 설정하여, TCP segment를 보낸다. 연결할 준비가 되었다고 한다. 전송을 시작한다.

이러한 Handsake과정을 통해 두 device는 서로가 이해할 수 있는 같은 protocol을 사용해 communication할 것임을 확실하게한다. 이러한 연결과정이 끝나면, A에서 B로 또는 B에서 A로 자유롭게 데이터를 주고받을 수 있다. 이것은 full-duplex로 동작하여 양방향으로 동시에 송수신할 수 있다.

이제 어느방향으로든 전송된 segment는 반드시 ACK가 설정된 segment에 의해 응답되어야 한다. 이런 방식으로 상대방이 어떤 segment를 받았는지 항상 알 수 있게 된다.

예를 들어, A가 sequence number = 1, acknowledge number = 50인 전송했다고 해보자. 올바르게 수신되었음을 확인한 B는 ACK flag를 설정하고, sequence number = 51으로 설정하여 A에게 응답을 전송해야한다. A는 다음에 전송해야할 sequence number, ACK flag를 통해 B가 sequence number = 1로 설정된 segment를 올바르게 응답하였다는 것을 알 수 있다. 만약 B가 acknowledge number = 101로 설정해서 응답을 하였다고 한다면, 이후에 A가 segment를 전송할 때는 sequence number = 101로 설정하여 전송해야 한다. 

 

2) TCP Disconnection

 

현재 설정된 TCP연결을 끊기 위해서는 4-way Handshake라는 다음과 같은 과정이 필요하다

(ACK+SYN와 다르게, ACK, FIN이 동시에 설정되어 보내지지 않고, 두번 나누어서 보내준다는 차이점이 있다)

- 연결을 끊을 준비가 되어있는 Computer A가 FIN을 설정하여, TCP segment를 보낸다. 종료할 준비가 되었냐고 한다.

- Computer B가 ACK를 설정하여 응답한다. 종료할 준비가 되었다고 한다.

- Computer B가 FIN을 설정하여 응답한다. 종료할 준비가 되었냐고 한다.

- Computer A가 ACK를 설정하여 응답한다. 종료할 준비가 되었다고한다. 종료한다.

 

simplex mode에서 TCP connection은 한쪽만 닫힌 상태로 남아있을 수 있는데, 자주 발생하는 것은 아니다.

 

4. TCP Socket states

 

Socket이란, 잠재적인 TCP connection에서 end-point의 instantiation이다. Instantiation이란, 다른 어떤 곳에서 정의된 것을 실제 구현하는 것이다. 특정 port로 데이터를 보낼 때, 어떤 program이 socket을 구현하여 open하고 있지 않다면, 응답은 오지 않는다. 

TCP socket은 다음과 같은 여러가지 state에 있을 수 있다

LISTEN은 TCP socket이 open되어있어 connection을 맺을 준비가 되어있는 상태이다. server측에서만 나타난다. 

SYN_SENT는 SYN request가 전송되었지만, 아직 connection이 이루어 지지 않은 상태이다. client측에서만 나타난다.

SYN_RECEIVED는 LISTEN state의 socket이 SYN을 받았고, SYN+ACK를 보낸 상태이다.  server측에서만 나타난다.

ESTABLISHED는 TCP연결이 확립되어, 자유롭게 서로 데이터를 주고받을 수 있는 상태이다. 

FIN_WAIT는 FIN이 보내졌고, ACK를 받지 못한 상태이다. 

CLOSE_WAIT는 TCP layer에서 connection은 끊어졌지만, socket을 open한 application이 아직 socket을 해제하지 않은 상태이다.  

CLOSED는 connection이 완전히 끊어져, 어떠한 communication도 불가능한 상태이다.

 

이러한 state이름은 OS에 따라 다를 수 있는데, 이것은 TCP의 영역이 아닌 OS level에서 결정되기 때문이다. 

만약, TCP layer에서 trouble shooting을 하고싶다면, 사용하고있는 OS의 socket state의 정의를 확인하고 정상적인 상태로 동작하고 있는지 확인하면 된다. 

 

5. Connection-oriented & Connectionless Protocol

 

Connection-oriented protocol은 연결을 맺음으로서, 모든 데이터가 적절하게 전송되었는지를 확인한다. 모든 전송되는 data는 acknowledged된다. 이를 통해, 어떤 데이터가 올바르게 전송되었고, 어떤 것이 그렇지 않은지를 확인할 수 있다. 

Ethernet, IP level에서 checksum을 확인하여 데이터가 올바르지 않으면 버릴 순있지만, 이를 실제로 재전송할지 말지, 또는 언제 재전송할지는 TCP layer에서 결정한다.

TCP layer는 ACK를 받으므로 데이터가 성공적으로 전송되었는지 알 수있는 최적의 위치에 있다. TCP는 모든 segment를 순서에 맞게 순차적으로 전송하지만, 실제로 순서에 맞게 도착하는 것은 아니다. 이것은 sequence number는 이것을 재전송시에 순서에 맞게 으로 정리할 수 있도록 한다.

하지만, 이러한 TCP방식은 추가적인 traffic을 사용하는 등 많은 overhead를 가지고 있고 connectionless protocol은 이러한 overhead를 줄인다.

일반적으로 우리는 UDP(User Datagram Protocol)을 사용한다. 

UDP는 connection도 없고, acknowledgement도 없다. 이것은 중요하지 않은 메세지를 전송하는데는 유용하다. 

예를 들어, video streaming data를 전송하는 경우, 일부 frame이 수신측에 도착하지 않아도 충분히 시청하는데는 문제가 없다. TCP의 overhead를 제거하고 UDP로 고품질의 video를 전송하면 오히려 더 나은 사용자 경험을 보여줄 수 있다.  

 

6. Firewall

 

Firewall이란, 특정한 기준을 충족시키는 traffic을 차단하는 device이다. 이것은 여러 layer에서 동작할 수 있다. 

주로 transport layer의 firewall가 많이 사용된다. 예를 들자면, 445 port로 들어오는 외부 network의 traffic을 차단하는 것이다. Firewall은 독립적인 network device일 수 있지만, 어디서나 동작할 수 있는 program이라고 생각하면 편하다. 예를 들자면, router에서 firewall의 기능을 제공한다든지 하는 것이다. 개별 host에서도 firewall기능이 내장된 OS를 사용함으로서, 특정 서비스에 대한 traffic을 차단할 수 있다.