본문 바로가기

Web | Network

Network - TCP/IP

TCP/IP

위키백과에 따르면 TCP/IP는 패킷 통신 방식의 인터넷 프로토콜인 IP와 전송 조절 프로토콜인 TCP로 이루어져 있으며, IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서와 받는 순서가 다를 수 있다. TCP는 IP 위에서 동작하는 프로토콜로, 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다. HTTP, FTP, SMTP 등 TCP를 기반으로 한 많은 수의 애플리케이션 프로토콜들이 IP 위에서 동작하기 때문에, 묶어서 TCP/IP로 부르기도 한다.

IP는 연결의 허리로 표현된다.

따라서, TCP/IP는 하나의 프로토콜이 아닌 TCP와 IP를 합쳐서 부르는 말이다. 또한, TCP/IP를 사용하겠다는 것은 IP 주소 체계를 따르고 IP Rouing을 이용해 목적지에 도달하며, TCP의 특성을 활용해 송신자와 수신자의 논리적 연결을 생성하고 신뢰성을 유지할 수 있도록 하겠다는 것을 의미한다. 즉, TCP/IP를 말한다는 것은 송신자가 수신자에게 IP 주소를 사용하여 데이터를 전달하고, 그 데이터가 제대로 갔는지, 너무 빠르지는 않는지, 제대로 받았다고 연락은 오는지에 대한 이야기이다.

 

인터넷에서 무언가를 다운로드할 때, 중간에 끊기거나 빠지는 부분이 없이 완벽하게 받을 수 있는 이유가 바로 TCP의 이러한 특성 때문이다. 데이터가 빠지지 않고 제대로 전달되었는 지를 챙기는 꼼꼼함이 있기 때문이다. OSI 7 계층 중 Layer 4 : Transport Layer (전송 계층) 에 해당하는 부분이다. 그렇기 때문에, 위에서 말했 듯, HTTP, HTTPS, FTP, SMTP와 같이 데이터를 안정적으로 모두 보내는 것을 중요시하는 프로토콜들의 기반이 된다. 이 말은 즉슨 TCP를 기반으로 하는 프로토콜들은 추후 언급할 TCP의 '3-way handshake'를 거친 후, 각자 프로토콜 (Layer 7) 에 기반한 교환 과정을 실시한다는 이야기이다.

 

 

위 이미지는 TCP 기반의 프로토콜인 HTTPS 의 "SSL handshake"를 도식화한 것으로, TCP는 Layer 4, HTTPS는 Layer 7이다. 파란색의 상자들은 TCP의 "3-way handshake"에 해당되며, 노란색 상자들은 HTTPS의 "SSL handshake"에 해당된다. HTTPS는 TCP 기반 프로토콜이기 때문에, SSL handshake에 앞서 3-way handshake를 실시함을 알 수 있다.

 

TCP는?

TCP는 Transmission Control Protocol (전송 제어 프로토콜) 의 줄임말로, 근거리 통신망/인트라넷/인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간의 일련의 옥텟을 안정적으로, 순서대로, 에러 없이 교환할 수 있게 한다.

 

TCP는 전이중 (Full-Duplex), 점대점 (Point to Point) 방식이며. 전이중이란 전송이 양방향으로 동시에 일어날 수 있음을 의미하며, 점대점이란 각 연결이 정확히 2개의 종단점을 갖고 있다는 것을 의미한다. TCP는 연속성보다 신뢰성있는 전송이 중요할 때 사용되는 프로토콜이다.

 

TCP는 OSI 7 계층 중 4 계층에 해당하며, IP가 패킷들의 관계를 이해하지 못하고 그저 목적지를 제대로 찾아가는 것에 중점을 둔다면, TCP는 통신하고자 하는 양쪽 단말 (endpoint) 이 통신할 준비가 되었는지, 데이터가 제대로 전송됐는지, 데이터가 가는 도중 변질되지는 않았는지, 수신자가 얼마나 받았고 빠진 부분은 없는지 등을 점검한다. 이러한 정보는 TCP Header에 담겨 있으며, SYN, ACK, FIN, RST, Source Port, Destination Port, Sequence Number, Window Size, Checksum과 같은 신뢰성 보장과 흐름 제어, 혼잡 제어에 관여할 수 있는 요소들도 포함되어 있다. 또한, IP Header와 TCP Header를 제외한, TCP가 실을 수 있는 데이터 크기를 "세그먼트(Segment)"라고 부른다.

 

TCP는 IP의 정보 뿐만 아니라 Port를 이용하여 연결한다. 한쪽 단말 (Endpoint)에 도착한 데이터가 어느 입구 (Port) 로 들어가야 하는지 알아야 연결을 시도할 수 있기 때문이다. 예를 들어, HTTP로 이루어진 문서를 주고받고자 할 경우, 데이터 통신을 하기 위해서는 80번 포트로 연결해야 한다. 포트에 관련된 내용은 아래를 참고.

https://lgphone.tistory.com/89?category=918082 

 

Web - IP, 포트, 그리고 로컬호스트 (IP, Port, and Localhost)

IP 주소 IP 주소란 TCP/IP 프로토콜을 사용한 통신을 할 때, 송신자와 수신자를 구별하기 위한 고유의 주소를 말한다. 그리고 인터넷에 연결된 모든 통신망과 그 통신망에 연겨로딘 텀퓨터에 부여

lgphone.tistory.com

 

3-way Handshake

TCP의 송신자와 수신자는 데이터를 전송하기 전 먼저 서로 통신이 가능한 지 의사를 묻고 한 번에 얼마나 받을 수 있는지 등의 정보를 확인한다. 이는 신뢰성 있는 통신을 하기 위해서이며, 데이터를 안전하고 빠지는 부분 없이 보내기 위함이다. TCP는 TCP Header 내의 SYN, SYN/ACK, ACK Flag를 사용하여 통신을 시도한다.

 

 

1. 송신자 (CLOSED) 가 수신자 (LISTEN) 에게 "SYN"을 날려 통신이 가능한지 확인한다. 이 때, Port가 열려있어야 (LISTEN) 한다.

2. 수신자 (SYN_RCV) 가 송신자 (CLOSED) 로부터 "SYN"을 받고, 다시 "SYN/ACK"을 송신자에게 날려 통신할 준비가 되어있음을 알린다.

3. 송신자 (ESTABLISHED) 가 수신자 (SYN_RCV) 의 "SYN/ACK"을 받고, "ACK"를 다시 날려 전송을 시작함을 알린다. 이 때 최종적으로 수신자가 ESTABLISHED가 된다.

 

이 외에도 자주 사용하는 Flag로는 RST, FIN, FIN/ACK, PUSH 등이 있다. 이에 관한 내용은 다음 글을 참고.

https://mindgear.tistory.com/206

 

TCP flag(URG, ACK, PSH, RST, SYN, FIN)

출처 : http://pmj0403.tistory.com/entry/TCP-flagURG-ACK-PSH-RST-SYN-FIN TCP flag(URG, ACK, PSH, RST, SYN, FIN) TCP(Transmission Control Protocol)는 3-WAY Handshake 방식을 통해 두 지점 간에 세션을..

mindgear.tistory.com

 

4-way Handshake

4-way handshake는 TCP의 연결을 해제 (Connection Termination) 하는 과정에서 사용된다. 여기서 연결 해제는 4단계인 이유는 클라이언트가 데이터 전송을 마쳤다고 하더라도 서버는 아직 보낼 데이터가 남아있을 수 있기 때문에, FIN에 대한 ACK만 보낸 후 데이터를 모두 전송하고 자신도 FIN 메시지를 보낼 수 있도록 여지를 남겨놓기 때문이다.

 

 

1. 송신자 (ESTABLISHED) 가 수신자 (ESTABLISHED) 에게 "FIN"을 날려 연결을 종료하겠다고 알린다. 이 때 다시 수신자가 "FIN" 플래그로 응답하기 전 까지는 연결을 계속 유지한다 (송신자 FIN_WAIT 상태) .

2. 수신자 (CLOSE_WAIT) 는 확인 메시지 (ACK) 를 보내고 자신의 통신이 끝날 때까지 기다린다. 이 때, 수신자는 Acknowledgement Number 필드를 (Sequence Number + 1) 으로 지정하고, ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다. 그리고 자신이 전송할 데이터가 남아있다면 이어서 계속 전송한다.

3. 수신자 (CLOSE_WAIT) 가 통신이 끝났으면, 연결 종료 요청에 합의한다는 의미로 다시 송신자에게 FIN을 보낸다.

4. 송신자는 수신자에게 확인했다는 메시지 (ACK) 를 보낸다. 

 

이 때, 만약 서버에서 FIN 플래그를 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송으로 인해 FIN 패킷보다 늦게 도착하는 경우가 있을 것이다. 이 경우를 대비하여 클라이언트는 서버로부터 FIN 플래그를 수신하더라도 일정시간 동안 세션을 남겨 놓고 잉여 패킷을 기다리는 과정을 거친다. 이를 TIME_WAIT이라고 한다.

플래그 정보

TCP Header에는 CONTROL BIT (플래그 비트, 6 bit) 가 존재하며. 각각의 bit는 "URG-ACK-PSH-RST-SYN-FIN"의 의미를 가진다. 즉, 해당 위치의 bit가 1이면 해당 패킷이 어떠한 내용을 담고있는 패킷인지를 나타낸다.

 

예를 들어, SYN 패킷을 보낸다면, 이 때 CONTROL BIT 는 000010이 될 것이다.

 

TCP의 특징

흐름제어

송신자는 자신이 한 번에 얼마나 보낼 수 있는지, 수신자는 자신이 데이터를 어디까지 받았는지 끊임없이 확인하고 TCP Header 내의 "Window Size"를 사용해 한번에 받고 보낼 수 있는 데이터의 양을 정한다. 여기서 window는 일정량의 데이터를 의미한다. 보통 받는 측의 사정이 더 중요하다 보니, Window Size는 수신자가 정한다 (3-way handshake 때). 그리고 자신의 상황에 따라 Window Size를 조절한다. 즉, 데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지한다.

 

그리고 지금까지 자신이 받은 데이터 양을 확인하여 송신자에게 보내는데, 이를 "Acknowledgement Number"라고 한다. 만약 수신자가 300번째의 데이터를 받았다면, Acknowledgement Number에 1을 추가하여 301을 보낸다. 300번까지 받았으니 301번부터 보내라는 뜻이다. 그리고 이 데이터의 순서 번호를 표기한 것이 바로 "Sequence Number"이다.

 

ISN (Initial Sequence Numbers) 는 초기에 설정되는 Sequence Number로, 0부터 시작하지 않고 랜덤한 난수로 설정된다. 이 이유는 연결을 맺을 때 사용하는 포트는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용되기 때문이다. 만약 두 통신 호스트가 과거 사용된 포트 번호 쌍을 사용하게 된다면 서버 측에서는 패킷의 SYN을 보고 패킷을 구분할 때 난수가 아닌 순차적인 Number가 전송된다면 이전의 연결로부터 오는 패킷이라고 인식할 수 있기 때문이다.

혼잡제어

데이터를 주고받는 양 단말도 중요하지만 데이터가 지나가는 네트워크망의 혼잡 또한 중요하다. 다양한 방법이 있지만, 그 중 "Slow Start"에 대해 말하자면, 송신자는 연결 초기에 데이터 송출량을 낮게 잡고 보내면서 수신자의 수신을 확인하며 데이터 송출량을 조금씩 늘린다. 그렇게 되면 현재 네트워크에서 가장 적합한 데이터 송출량을 확인할 수 있게 된다. 이것이 "Slow Start"이다.

 

이와 같이 혼잡제어는 네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지하는 것이며, 정보의 소통량이 과다하면 패킷을 조금만 전송하여 혼잡 붕괴 현상이 일어나는 것을 막는다.

출처

https://mindgear.tistory.com/206

https://aws-hyoh.tistory.com/entry/TCPIP-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

https://github.com/WeareSoft/tech-interview/blob/master/contents/network.md#questiontcp-%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8-1

https://www.inven.co.kr/webzine/news/?news=165870