for Robot Artificial Inteligence

TCP/IP 이해하기

|

TCP의 개념에 대해서 1,2에서 정리를 하였다. 이번 채터는 TCP/IP를 이해하는 페이지가 될 것이다.

TCP/IP 정의

오늘날 인터넷 통신의 대부분은 패킷통신을 기본으로 하고 있다. TCP/IP는 이러한 패킷 통신을 위한 인터넷 규약이다. IP는 데이터의 조각을 최대한 빨리 목적지로 보내는 역할을 한다. 조각들의 순서가 뒤바뀌거나 일부가 누락되더라도 크게 상관하지 않고 보내는데 집중을 한다. TCP는 IP보다 느리지만 꼼꼼한 방식을 사용한다. 도착한 조각을 점검하여 줄을 세우고, 망가졌거나 빠진 조각을 다시 요청한다.

두방식을 통합하여 인터넷 데이터 통신을 하는 것이 TCP/IP 이다.

TCP/IP 개념

TCP/IP는 패킷 통신 방식의 프로토콜 IP(인터넷 프로토콜)전송 조절 프로토콜인 TCP(전송제어 프로토콜) 이루어져있다. -여러 연결방식을 패킷 통신

IP는 패킷 전달 여부를 보증하지 않고, 패킷을 보낸 순서와 받는 순서가 다를 수 있다. TCP는 IP위에서 동작하는 프로토콜, 데이터의 전달을 보증하고 랜덤하게 보낸 데이터들을 Client가 받는 데이터를 조립한다.

  • TCP/IP 는 두개의 프로토콜이다.
    • IP는 복잡한 네트워크 망을 통하여 가장 효율적인 방법으로 데이터의 작은 조각들을 되도록 빨리 보내는 역할을 한다.
    • TCP 데이터를 잘게 잘라 보내면서 중간에 빠진 부분을 점검하면서 다시 요청하는 일을 담당한다.

HTTP,FTP,SMTP등 TCP를 기반으로 한 많은 수익 어플리케이션 프로토콜들이 IP위에서 동작하기 때문에, 묶어서 TCP/IP로 부르기도 한다.

  • HTTP는 주소창에서 많이 사용하는 프로토콜이고 위에 FTP, SMTP들 또한 TCP/IP 기반에서 웹이나 여러 데이터를 주고 받기 위한 프로토콜이다.

TCP/IP 4계층

OSI(Open Systems Interconnections)7계층은 시스템들의 연결을 위한 모델입니다. TCP/IP 4계층은 이를 웹 서비스에 맞게 단순화시킨 모델입니다.

  • 응용계층: HTTP, FTP, Telnet, SMTP 등 네트워크를 사용하는 응용프로그램
  • 전송계층: TCP, UDP 등 시스템을 연결하고 데이터를 전송하는 역할
  • 인터넷계층: ICMP, IGMP, IP등 데이터를 정의하고 데이터의 경로를 라우팅
  • 물리계층: Ethernet, ATM등 네트워크 하드웨어를 의미합니다

클라이언트로부터 특정 주소로 요청이 들어오면 DNS 상에서 IP주소를 받아옵니다 → HTTP 계층에서 HTTP 메시지를 작성합니다 → TCP 계층에서 HTTP 메시지를 패킷으로 분해합니다. → IP계층에서 전송위치를 확인하고 → 네트워크를 통하여 전송합니다. 그 이후는 위의 과정의 역순으로 진행하여 처리합니다.

Reference

https://brunch.co.kr/@wangho/6

Comment  Read more

TCP 개념 2

|

TCP에 대해 구체적으로 알아보겠다. TCP에 중요한 개념을 다시한번 상기하자

TCP 정의

TCP란 Transmission Control Protocol 의 약어로 컴퓨터가 다른 컴퓨터와 데이터 통신을 하기 위한 규약(프로토콜(协议))의 일종이다. TCP는 세계 통신 표준으로 개발된 OSI 모형에서 4번째 계층인 전송 계층(Transport Layer)에서 사용하는 규약으로, 보통 하위 계층에서 사용하는 IP와 엮어서 TCP/IP로 표현하는 경우가 많다.

  • 즉, 전송 계층에서 사용하는데, 하위 계층에서 사용하는 IP와 역어 TCP/IP로 표현된다.

TCP stands for Transmission Control Protocol which indicates that it does something to control the transmission of the data in a reliable way.

The process of communication between devices over the internet happens according to the current TCP/IP suite model(stripped out version of OSI reference model). The Application layer is a top pile of stack of TCP/IP model from where network referenced application like web browser on the client side establish connection with the server. From the application layer, the information is transferred to the transport layer where our topic comes into picture. The two important protocols of this layer are – TCP, UDP(User Datagram Protocol) out of which TCP is prevalent(since it provides reliability for the connection established). However you can find application of UDP in querying the DNS server to get the binary equivalent of the Domain Name used for the website

TCP 연결 설정

TCP는 전화를 거는 것처럼 상대와 연결을 설정하고 통신을 시작한다.

TCP provides reliable communication with something called Positive Acknowledgement(접수) with Re-transmission(PAR). The Protocol Data Unit(PDU) of the transport layer is called segment. Now a device using PAR resend the data unit until it receives an acknowledgement. If the data unit received at the receiver’s end is damaged(It checks the data with checksum functionality of the transport layer that is used for Error Detection), then receiver discards the segment. So the sender has to resend the data unit for which positive acknowledgement is not received. You can realize from above mechanism that three segments are exchanged between sender(client) and receiver(server) for a reliable TCP connection to get established. Let us delve how this mechanism works

공식적인 TCP 절차로 Three way Handshake

1) 상대에게 통신을 하고 싶다고 메세지를 보낸드 (SYN(Synchronize Sequence Number)) 2) 상대는 그 메세지에 대한 응답 + 나도 통신 준비가 되었다는 메세지를 보낸다. (SYN-ACK(Synchronize Sequence Number+Acknowledgement)) 3) 2번에서 받은 메세지에 응답을 보낸다(ACK)

이와 같이 과정을 통해 나와 상대가 통신준비를 맞쳤고, 현재, 통신이 연결되어 있음을 보장하게 된다. 기존의 회선 교환 방식의 개념과 유사하지만 단순히 서로 연결되어 있는 것만 보장한다.

  • Step 1 (SYN) : In the first step, client wants to establish a connection with server, so it sends a segment with SYN(Synchronize Sequence Number) which informs server that client is likely to start communication and with what sequence number it starts segments with
  • Step 2 (SYN + ACK): Server responds to the client request with SYN-ACK signal bits set. Acknowledgement(ACK) signifies(의미하다) the response of segment it received and SYN signifies with what sequence number it is likely to start the segments with
  • Step 3 (ACK) : In the final part client acknowledges the response of server and they both establish a reliable connection with which they will start the actual data transfer

The steps 1, 2 establish the connection parameter (sequence number) for one direction and it is acknowledged. The steps 2, 3 establish the connection parameter (sequence number) for the other direction and it is acknowledged. With these, a full-duplex communication is established.

Note – Initial sequence numbers are randomly selected while establishing connections between client and server.

TCP 통신에서 중요한점

  • 데이터 누락을 막고 Three handshake를 통해 항상 연결 상태를 유지해야한다
  • Client가 받을 수 있는 할당 데이터량이 있다. 그 한계를 넘어 버린 상태에서 서버가 데이터를 보내게 되면 데이터 누락이 생긴다.
  • 그렇기 때문에 Client측에서 한번에 받을 수 있는 데이터량을 Server에 보낸다.
  • ACK를 계속 보내서 잘 받았는지 잘 보내졌는지 확인 응답을 계속 보낸다.
  • 사용자가 많으면 네트워크 회선에 부하가 걸려서 사망하게 된다. 그렇기 때문에 TCP에서 Congestion Control 요소가 중요하다.

TCP 특징

현존하는 상당수의 네트워크 프로그램은 TCP를 기반으로 통신한다. 그만큼 데이터 신뢰성을 중요시하는 프로그램들이 많다. 이메일이나 파일 전송같은 경우 데이터 하나가 날아가면 꽤 골치아픈 문제가 발생한다. 하지만 TCP에서 제공하는 신뢰성 보장 방법들을 반드시 사용할 필요는 없다. 만약 프로그램에서 필요하지 않든다면 구현하는 과정에서 기능을 끌 수 있게 되어 있다. 물론 그만큼 신뢰성이 떨어지는 상황은 감수해된다.

  • 즉, 컴퓨터 간에 라우터로 네트워크를 전송 받을 때, TCP, C++의 데이터 구조에서 펑션이나 데이터 멤버들을 이용하여 이와 같은 규약을 지켜 데이터의 안전성과 흐름을 보장한다.
    • Three handshake
      • 1) SYN 2) SYN-ACK 3) ACK
    • Flow Control
    • Congestion Control 그 외에 TCP 자체가 오히려 비효율 적인 경우도 발생한다. 대표적으로 실시간성을 중요시하거나 응답성을 중요시하는 프로그램인데 이를 위해 개발 된것이 바로 UDP이다.

TCP 정리

  • TCP는 데이터 전달을 관리하는 규칙
  • 데이터를 작게 나누워서 한 쪽에서 다른쪽으로 옮기고, 이를 다시 조립하여 원래의 데이터로 만드는 규칙(Torrents)
    • 여기서 잘게 나뉜 데이터 단위를 패킷
    • 인터넷에서는 정보를 전달하는 단위
  • TCP는 패킷을 조립하고, 손실된 패킷을 확인하고, 재전송하도록 요청하는 기능

위에서 가장 기본이 되는 내용을 살펴보았다 그렇다면 자세히 TCP에 무슨 기능이 있고 어떻게 일을 하는지 살펴 보자

TCP가 가지고 있는 Function(기능)

  • 신뢰성 있는 전송(Reliable Transmission)
    • Dupack-based retransmission
      • 정상적인 상황에서 CLient나 Sever로부터 ACK의 요칭이 연속적으로 전송된다.
      • 그러나 특정 ACK가 중복으로 올 경우 패킷 이상을 감지하고 재전송을 요청한다.
    • Timeout-based Retransmission
      • 일정시간동안 ACK을 수신 못할 경우 재전송 요청
  • 흐름제어(Flow Control)
    • 데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지한다.
    • 수신자가 윈도우 값을 통해 수신량을 정할 수 있다.
  • 에러 감지(Error Detection)
    • 데이터 변형, 분실 오류 방지
    • Check sum을 황용하여 데이터 변형 감지
  • 혼잡 제어(Congestion Control)
    • 네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지
    • 정보의 소통량이 과다하면 패킷을 조금만 전송하여 혼잡 붕괴를 방지

TCP Header file

  • Source port/ Destination port
  • Sequence number
    • SYN = 1: 초기 시퀀스 번호. ACK번호는 이값에 1을 더한값
    • SYN = 0: 현재 섹션의 세그먼트 데이터에서 최초 바이트값의 누적 시퀀스 번호
  • Acknowledgement number
    • ACK = 1: 필드의 값은 수신자가 예상하는 다음 시퀀스 번호
  • header Length
    • 32-bit 워드 단위로 나타낸 TCP 헤더 크기 값
  • Reserved
    • 미래에 사용 하기 위해 남겨둔 예비 필드이며 0으로 되어 있어야 한다.
  • window size
    • 수신 윈도 크기
    • 0이면 송신 프로세스 전송 중시
  • checksum
    • 헤더 및 데이터의 에러 확인을 위해 사용되는 16 비트

TCP process in detail

  • TCP connection(3-way handshake)
    • 먼저 open()을 실행한 클라이언트가 SYN을 보내고 SYN_SENT 상태로 대기한다
    • 서버는 SYN_RCVD 상태로 바꾸고 SYN과 응답 ACK를 보낸다.
    • SYN과 응답 ACK을 받은 클라이언트는 ESTABLISHED 상태로 변경하고 서버에게 응답 ACK를 보낸다.
    • 응답 ACK를 받은 서버는 ESTABLISHED 상태로 변경한다.

TCP Question

한 개의 Server Socket에서 열 수 있는 최대 동시 연결 갯수는 65536개이다?

  • 정답은 X입니다.
  • 소켓은 protocol, source addr, source port, destination addr, destination port로 unique하게 구성됩니다
  • 소켓의 수는 설정된 리눅스 파일 디스크립터만큼 생성할 수 있습니다.

TCP는 데이터 순서 보장을 위해 한 번에 하나의 Packet만 전송할까?

  • 정답은 X입니다.
  • 많은 데이터를 매번 ACK를 받고 보내기엔 너무 많은 Cost가 필요합니다.
  • 위와 같은 문제를 해결하기 위해 Window라는 논리적인 패킷 묶음을 사용합니다
    • 최소한의 ACK로 데이터 순서를 보장하며 전송을 할 수 있습니다.

Reference

https://nesoy.github.io/articles/2018-10/TCP

Comment  Read more

TCP 개념

|

TCP 정의

TCP란 Transmission Control Protocol 의 약어로 컴퓨터가 다른 컴퓨터와 데이터 통신을 하기 위한 규약(프로토콜(协议))의 일종이다. TCP는 세계 통신 표준으로 개발된 OSI 모형에서 4번째 계층인 전송 계층(Transport Layer)에서 사용하는 규약으로, 보통 하위 계층에서 사용하는 IP와 엮어서 TCP/IP로 표현하는 경우가 많다.

  • 즉, 전송 계층에서 사용하는데, 하위 계층에서 사용하는 IP와 역어 TCP/IP로 표현된다.

TCP stands for Transmission Control Protocol which indicates that it does something to control the transmission of the data in a reliable way.

TCP 개발 동기

TCP의 개발 동기는 군사적인 목적이 시작이었다. 적국이 푝격, 심지어 핵전쟁이 발발하더라도 죽지 않고 정상적으로 동작하는 네트워크를 기초로 만들어졌다. 옛날 통신방식으로는 회션교환(CirCuit switching)(영화나 드라마 일제 강점기에서 자주 나오는 다이얼 형태의 방식)이 있었는데, 이 방식은 예를 들어 서울에서 부산으로 간다고 할 때 미리 이동할 경로를 경부고속도로만 이용한다로 정해놓은 방식이다. 이런 상황은 통신을 중계해주는 곳이 망가지너나 단락이 되면 통신이 바로 끊키는 상황이 벌어진다. 이에 따라 사용 된것이 패킷교환(Packet switching) 방식인데, 회선 교환가 다르게 경로가 정해져 있지 않다. 경부고속도로가 심각하게 막히면 다른 고속도로나 국도를 우회해서 가는 방식이다. 따라서 서로 연결이 가능한 회선 하나만 남아있어도 통신이 끊켜도 우회에서 통신할수 있는 환경이다. 다만 이 방식은 어떻게든 통신을 유지하는 것이 목적이므로, 네트워크의 환경이 떨어진다. 이로 인해 중간에 데이터가 유실되거나 너무 늦게 전달 되는 등 신뢰성이 떨어지는 문제점이 있다. 이런 문제점을 해결하고자 통신 규약 TCP가 개발되었다.

The process of communication between devices over the internet happens according to the current TCP/IP suite model(stripped out version of OSI reference model). The Application layer is a top pile of stack of TCP/IP model from where network referenced application like web browser on the client side establish connection with the server. From the application layer, the information is transferred to the transport layer where our topic comes into picture. The two important protocols of this layer are – TCP, UDP(User Datagram Protocol) out of which TCP is prevalent(since it provides reliability for the connection established). However you can find application of UDP in querying the DNS server to get the binary equivalent of the Domain Name used for the website

TCP 연결 설정

TCP는 전화를 거는 것처럼 상대와 연결을 설정하고 통신을 시작한다.

TCP provides reliable communication with something called Positive Acknowledgement(접수) with Re-transmission(PAR). The Protocol Data Unit(PDU) of the transport layer is called segment. Now a device using PAR resend the data unit until it receives an acknowledgement. If the data unit received at the receiver’s end is damaged(It checks the data with checksum functionality of the transport layer that is used for Error Detection), then receiver discards the segment. So the sender has to resend the data unit for which positive acknowledgement is not received. You can realize from above mechanism that three segments are exchanged between sender(client) and receiver(server) for a reliable TCP connection to get established. Let us delve how this mechanism works

공식적인 TCP 연결 절차로 Three way Handshake

1) 상대에게 통신을 하고 싶다고 메세지를 보낸드 (SYN(Synchronize Sequence Number)) 2) 상대는 그 메세지에 대한 응답 + 나도 통신 준비가 되었다는 메세지를 보낸다. (SYN-ACK(Synchronize Sequence Number+Acknowledgement)) 3) 2번에서 받은 메세지에 응답을 보낸다(ACK)

이와 같이 과정을 통해 나와 상대가 통신준비를 맞쳤고, 현재, 통신이 연결되어 있음을 보장하게 된다. 기존의 회선 교환 방식의 개념과 유사하지만 단순히 서로 연결되어 있는 것만 보장한다.

  • Step 1 (SYN) : In the first step, client wants to establish a connection with server, so it sends a segment with SYN(Synchronize Sequence Number) which informs server that client is likely to start communication and with what sequence number it starts segments with
  • Step 2 (SYN + ACK): Server responds to the client request with SYN-ACK signal bits set. Acknowledgement(ACK) signifies(의미하다) the response of segment it received and SYN signifies with what sequence number it is likely to start the segments with
  • Step 3 (ACK) : In the final part client acknowledges the response of server and they both establish a reliable connection with which they will start the actual data transfer

The steps 1, 2 establish the connection parameter (sequence number) for one direction and it is acknowledged. The steps 2, 3 establish the connection parameter (sequence number) for the other direction and it is acknowledged. With these, a full-duplex communication is established.

Note – Initial sequence numbers are randomly selected while establishing connections between client and server.

공식적인 TCP 연결 해제 절차로 four way Handshake

TCP의 연결을 해제(Connection Termination) 하는 과정

  • 예를 들어, A 프로세스(Client)가 B 프로세스(Server)에 연결 해제를 요청
  • A->B: FIN
    • 프로세스 A가 연결을 종료하겠다고 FIN 플래그 전송
    • 프로세스 B가 FIN 플래그로 응답하기 전까지 연결을 계속 유지
  • B->A: ACK
    • 프로세스 B는 일단 확인 메세지를 보내고 자신의 통신이 끝날 때까지 기다린다.(이상태가 TIME_WAIT 상태)
    • 수신자는 Acknowledgement Number 필드를 (Sequence Numb er + 1)로 지정하고, ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다.(자세한 설명은 TCP 개념 2에 설명)
    • 자신이 전송할 데이터가 남아있다면 이서어 계속 전송한다.
  • B-> A: FIN
    • 프로세스 B가 통신이 끝났으면 연결 종료 요청합이한다는 의미로 A에게 FIN 플래그 전송한다.
  • A-> B: ACK
    • 프로세스 A는 확인했다는 메세지를 전송한다.

TCP 신뢰성 보장과 흐름 제어 (Flow Control)

연결 설정을 통해 통신 준비를 맞치면 이제 서로 데이터를 주고 받을 수 있다. 다만 네트워크를 통해서 한 번에 보낼 수 있는 데이터의 양은 제한되어 있어 분할해서 보내야 한다.(약간 토렌트 방식) 간단히 비유하면 책 한 권 내용을 보내줘야하는데 이것을 통째로 전송할 수 없으므로 한 장씩 보내는 것으로 생각하면 된다. 따라서 분할된 데이터에는 고유 번호가 부여되는데 이 는 책의 쪽 번호와 같다고 생각하면 된다. 이를 바탕으로 보내는 사람은 현재 몇 쪽을 보낸 것인지 상대에게 알려줄 수 있고, 받는 사람은 다음에 받을 자료가 몇쪽인지를 알고 보내는 사람에게 요청할 수 있게 된다.

이를 통해 데이터가 제대로 전달됐는지도 알 수 있다. 예를 들어 31쪽을 받을 차례인데 31쪽이 안오고 다른 데이터가 도착하면, “31 쪽을 보내주세요” 요청하도록 TCP가 설계되어 있다. 그러면 보내는 사람은 상대가 요청한 31쪽을 보내주게 된다. 더불어 47쪽을 보낼 떄 알람을 설정하게 되어 있는데, 만약 알람이 울릴 때까지 받는 사람이 48쪽을 달라고 하지 않는다면 역시 데이터가 누락된 것으로 추측할 수 있다. 이를 근거로 보내는 사람은 47쪽을 다시 전송할 수 있다.

여기까지 언급된 것만 보면 컴퓨터끼리 통신을 할 때 마치 데이터 하나씩만 전달 하는 것처럼 보일 수 있다. 물론 그렇게 통신한다고 해서 문제가 되는 것은아니나 당연히 상대가 많이 받을 수 있다면 많이 보내주는 것이 효율적이다. 하지만 무턱대고 보낼 수 있는 것도 아니다. 상대가 5쪽만 받을 수 이쓴ㄴ데 보내는 쪽에서 닥치고 10쪽씩 보내버리면 어차피 5쪽은 못 받고 누락되는 것은 마찬가지 이다. 따라서 받는 쪽에서 “나 32쪽 받아야함, 그러나 6쪽만큼 받을 수 있음”이라 알려주면 보내는 쪽에서 32쪽에서 37쪽까지 자료를 보내는 방식으로 동작한다.

이를 위한 TCP 헤더 파일을 살펴 보면

  • 목적지 주소
  • 확인 응답
  • 오류 검출 및 복원
  • 실제 데이터

이중 중요한 역할이 확인 응답인데, 확인 응답(Acknowledge) 파일은 송수신 시 꼐속 확인 응답을 보내어 잘 갔는지, 잘 왔는지 확인을 하여 데이터 신뢰도를 높인다. 하지만 데이터 용량이 증가하여 수신 속도가 떨어진다 는 단점이 있다. 그러나 단점보다는 신뢰성이 높다는 장점이 훨씬 크기 떄문에 무시한다.

TCP 혼잡 제어 (Congestion Control)

Congestion Control은 초기 TCP에는 없던 요소이다. 한정된 네트워크 대역폭에서 소수의 사람들이 쓸때는 몰랐지만, 사용자가 점점 늘어나다보니 네트워크 회선이 그 부하를 감당하지 못하고 사망하는 것이 원인이다. 여기서 말하는 사망이란, 송신해야 할 책의 날장이 중간에 있는 네트워크 기기(라우터 등)에 무한히 몰리게 되는 상황을 말한다.

  • 즉, 중간 네티워크 기기가 송신하는 날장의 속도가 그 기기가 수신하는 속도보다 느리면(즉 데이터를 받는 Client보다 데이터를 보내는 Server의 송신이 느리면)이러한 상황이 발생하게 된다. 독이 깨져있어서 물이 새는데, 물이 새는 속도보다 더 빨리 물을 채운다면 독이 넘치는 것과 같다.

이 상황에서 기존 TCP는 위에 언급 했던 방식대로 동작한다고 생각해보자. 그러면 다음 과 같은 일이 발생한다.

  • 송신자A: ‘이상하네, 벌써 47쪽을 보낸 지 한참 됐는데 왜 받았다는 연락이 안 올까. 한 번 더 보내야겠다!’
  • 송신자B: ‘이상하네, 벌써 47쪽을 보낸 지 한참 됐는데 왜 받았다는 연락이 안 올까. 한 번 더 보내야겠다!’
  • 송신자C: ‘이상하네, 벌써 47쪽을 보낸 지 한참 됐는데 왜 받았다는 연락이 안 올까. 한 번 더 보내야겠다!’ …

여기서 A,B,C는 라우터로 송신하는 (독을 물을 붓는 사람, Client) 사람들이다. 이미 라우터에는 아직 라우터가 미쳐 다 송신하지 못한 A,B,C의 날잘들이 남아 있다. 그런데 A,B,C가 각각 날장을 또 보내는데 크게 두가지 문제가 있다.

  1. 라우터의 저장에도 한계 용량이 있다. 독의 크기가 유한하기 때문에 물을 너무 많이 부으면 넘친다. 그 넘친 물을 다시 독으로 들어오지 않듯, 그렇게 라우터 내에 저장 공간에 저장되지 못한 날장들은 손실된다.

  2. 흐름 제어(Flow contorl)의 예시에서 보듯, 47쪽을 보냈는데 답신이 없으면 또 47쪽을 보낸다. 만약 라우터가 무한한 저장 공간을 가진다는 비현실적인 가정하에더라도, 결국 라이터에 쌓여가는 날장들 때문에 48쪽을 보낼 때까지 47쪽을 비정상적으로 많이 보낸다. 이는 비효율적이다. 심지어 그러한 가정도 없다면, 보내지는 날장들은 그저 종이의 낭비다(버려지는 패킷을 위해 전력을 사용했으니, 전력 낭비이다)

이러한 문제를 해결하기 위해 Congestion Control 요소가 TCP에 추가되었다.

단순한 예로 통신을 시작할 때 일단 보내는 쪽에서 30~35쪽까지 자료를 보낸다. 그래서 상대가 잘 받았으면 이후 보내는 양을 조금씩 늘려보는 방식을 취한다. 그러다 상대가 데이터를 제대로 받지 못한 것이 확인 되면 그 직시 보내는 양을 확 줄인다. 그리고 다시 슬금 슬금 보내는 양을 늘렸다가 또 못 받으면 줄여버리는 형태로 보내는 양을 조절하게 된다. 보내는 양을 늘리고 줄이는 방법은 AIMD(Addictive increase/Multicative Decrease) 를 채택하고 있으나, 구체적으로 적용되는 방식은 TCP 버전마다 방식이 다르다.

이 방식은 Bust를 줄이기 위한 이다. 깨진 독에 어떻게 물이 차오르기 시작하는지를 생각해보면 어렵지 않다. 어느 순간 빠지는 속도보다 들어오는 속도가 커지는 순간이다. 이것을 버스트라고 부르는데, 요점은 버스트가 나지 않으면 물이 차오르기 시작할 일도 없다. 버스트가 발생해서 물이 차오르기 시작했따면, 일단 물을 다 빠진 다음에 물을 부으면 된다는 생각이다. 이를 네트워크 환경에 맞춰 해석하면, 처음에 버스트가 생기지 않을 적절한 양을 보내고, 버스트가 일어나 라우터에 날장들이 쌓이기 의심이 된다면, 일단 라우터에서 그 날장들이 빠지는 것을 기다리는 방법이 되는 것이다.

위 방법을 통해 TCP로 통신하는 모든 사용자들이 네트워크 상황에 따라 속도를 조절할 수 있게 되었으며, 많은 사용자들이 동시에 통신을 시도하면 속도에서 손해를 보지만 죽지는 않게 되었다. 이론적으로 100Mbps 회선에서 5명의 사람이 동시에 TCP로 통신을 시도한다면 초반에는 서로 차이가 있지만 궁극적으로는 100Mbps회선을 각각 20Mps씩 공평하게 나눠 가지는 효과를 가지게 된다.

TCP 통신에서 중요한점

  • 데이터 누락을 막고 Three handshake를 통해 항상 연결 상태를 유지해야한다
  • Client가 받을 수 있는 할당 데이터량이 있다. 그 한계를 넘어 버린 상태에서 서버가 데이터를 보내게 되면 데이터 누락이 생긴다.
  • 그렇기 때문에 Client측에서 한번에 받을 수 있는 데이터량을 Server에 보낸다.
  • ACK를 계속 보내서 잘 받았는지 잘 보내졌는지 확인 응답을 계속 보낸다.
  • 사용자가 많으면 네트워크 회선에 부하가 걸려서 사망하게 된다. 그렇기 때문에 TCP에서 Congestion Control 요소가 중요하다.

그외 이야기

현존하는 상당수의 네트워크 프로그램은 TCP를 기반으로 통신한다. 그만큼 데이터 신뢰성을 중요시하는 프로그램들이 많다. 이메일이나 파일 전송같은 경우 데이터 하나가 날아가면 꽤 골치아픈 문제가 발생한다. 하지만 TCP에서 제공하는 신뢰성 보장 방법들을 반드시 사용할 필요는 없다. 만약 프로그램에서 필요하지 않든다면 구현하는 과정에서 기능을 끌 수 있게 되어 있다. 물론 그만큼 신뢰성이 떨어지는 상황은 감수해된다.

  • 즉, 컴퓨터 간에 라우터로 네트워크를 전송 받을 때, TCP, C++의 데이터 구조에서 펑션이나 데이터 멤버들을 이용하여 이와 같은 규약을 지켜 데이터의 안전성과 흐름을 보장한다.
    • Three handshake
      • 1) SYN 2) SYN-ACK 3) ACK
    • Flow Control
    • Congestion Control 그 외에 TCP 자체가 오히려 비효율 적인 경우도 발생한다. 대표적으로 실시간성을 중요시하거나 응답성을 중요시하는 프로그램인데 이를 위해 개발 된것이 바로 UDP이다.

정리

  • TCP는 데이터 전달을 관리하는 규칙
  • 데이터를 작게 나누워서 한 쪽에서 다른쪽으로 옮기고, 이를 다시 조립하여 원래의 데이터로 만드는 규칙(Torrents)
    • 여기서 잘게 나뉜 데이터 단위를 패킷
    • 인터넷에서는 정보를 전달하는 단위
  • TCP는 패킷을 조립하고, 손실된 패킷을 확인하고, 재전송하도록 요청하는 기능

Reference

https://namu.wiki/w/TCP https://www.geeksforgeeks.org/tcp-3-way-handshake-process/

Comment  Read more

Seoul Robotics 후기

|

인턴쉽을 찾는 도중 한국에 Seoul Robotics라는 회사를 발견하였다. Lidar 센서를이용하여 3D perception software를 만드는 작은 회사이다.(사실 로보틱스라기 보다는 컴퓨터 비전을 이용한 AI 회사라고 보면 된다.) Seoul Robotics의 소개와 기술들을 보면서 매력적이라고 느꼇다. 또한 사장님의 페이스북과 유투브를 보면서 도 젊고 열정이 돋보였다. 내가 연구하고 있는 분야 SLAM과 비슷하지만 완전 다른 분야인데, 이쪽 분야는 Mapping을 하는 것이 아닌 말그대로 Lidar을 이용하여 물체를 인식하는 소프트웨어를 만드는 곳이다. 우선 나는 스타트업에 대해 관심도 많고, 비록 SLAM은 아니지만 물체 인식을하는 것에 있어서는 비슷하다고 판단하여 Resarch Engineer Intern - Machine learning에 지원하게 되었다.

얼마 않있어 Seoul Robotics에서 면접 날짜를 잡아주었다.

우선 기본적인 회사 내용을 공부하면서 특이하게도 회사 이름은 서울로보틱스이지만 구성원들 몇명이 외국인이기 때문에 영어가 필수이고 한국어가 옵션 조건이었다. 또한 이 창업 멤버들은 인터넷에서 만나 실리콘벨리에서 주최한 대회에 10위에 들면서 창업을 시작하게 되었다고 한다.

내가 여태까지 했던 프로젝트와 서울로보틱스와의 관계를 찾고 회사에 방향과 관심에 대해서 공부하면서 면접 준비를 하였다. 그리고 면접을 보게 되었다.

제 면접관은 베트남 분이셨는데 면접의 구성은 다음과 같았다.

  1. 자기소개
  2. 연구 분야 소개
  3. Machine learning 개발 경험이 있는지
  4. 경험이 있었다면 어떻게 개발을 하였는지
  5. 연구 분야에 대한 자세한 설명
  6. 내 연구분야와 서울로보틱스 데이터셋과 결합하여 어플리케이션 만들 수 있는지
  7. Q&A

대략 1시간 정도 면접을 보았다.

  1. 자기소개를 마치고, 연구 분야를 소개하는데 면접관님이 말하기를 본인들이 하고 있는 연구분야하고 다르기 때문에 자기는 제 쪽 분야에 대해서 잘 모른다고 하셨다. 그리하여 면접관님이 Machine learning 개발 경험이 있는지 물어보셨고, 학기 중에 Machine Vision 수업을 통해 식당 매뉴를 CNN Classification Machine learning을 하여 구현해본적이 있다고 말하였다. 자세하게 어떻게 만들게 되었는지 물어보셨는데, 2주동안 식당의 음식들을 사진을 찍어서 Labeling을 한다음 CNN을 통해 러닝을 시켜 Classify하였다고 말하였다. 그 외에 뭐 어플을 개발한적이 있냐고 물어보셨는데, 딱히 없고, 개발을 했다고 한다면, python에 Beautiful soup라이브러리를 이용해서 신문사가 관심을 가지고 있는 분야에 Web Data mining을 해보았다고 말하였다.

1,2,3,4 단계가 끝나고 제 연구 분야에 대해 자세하게 설명을 부탁하셨다. 어디서부터 설명해야 될지 몰라 우선 RGBD Camera를 이용해 SLAM을 하는데 ORB-SLAM을 이용하였고 SLAM 구조(BA,BoW,PnP)와 알고리즘 설명, Sensor Fusion설명을 하였는데, 본인의 전공이 아니다 보니 끝까지 설명하고 잘 모르시는 눈치였다. 여쨋건 설명이 끝나고 만약 인터뷰 합격하게 되면 2차에는 코딩 테스트가 있는데, 1주일 시간을 줘서 서울로보틱스 데이터셋을 이용해서 개발하여 보내줄 수 있냐고, 좋은 사업 아이템이 될 수 있다고 물으셧을 때, 할 수 있다고 말하였다.

Q&A시간에는 경쟁사는 어디이고 현재 소프트웨어가 실제로 팔리는지 물어보았을때, 한국에는 경쟁사가 없고 현재 중국이나 다른 지역에 경쟁사들이 있다고 말하였다.

면접이 끝나고 뭔가 찜찜했다. 데이터 셋을 주셔서 내가 개발한 시스템을 보내달라니. 심지어 내가 지원한 것은 인턴직위이고 회사에 계약직이든 정규직이든 일하지 않는 상태인데.

하지만 다행인지는 모르겠지만 1차 인터뷰에서 탈락을 하였다. 탈락 사유는 서울로보틱스의 연구방향과 다르기 때문이라는 얘기를 했다.

스타트업에 취업하기도 어렵지만, 나와 맞는 회사는 찾기도 어렵다라는 것을 깨달았다.

비록 탈락은 하였지만, 우리나라 스타트업 서울로보틱스 응원한다.

Comment  Read more

Microsoft Coding Test Round 1 후기

|

2020년 목표가 하나 있다. 4월에 인턴쉽을 찾는것! 11월부터 1월까지 Semantic SLAM Based on ORB-SLAM2 시스템 데이터를 Sensor Fusion Data에 관하여 연구를 하고 2월부터 3월초까지 IEEE/AIM 2020 Boston Conference Contribution paper을 준비하였다. 전염병으로 인하여 학교는 개방하지 않고 5월에 있을 ICIRA 2020 논문을 준비하는데 차질이 생겼는데, 뭐 방법이 있으려나, 3월 중 후반에, 어쩃든 뭐 아직 실험 결과는 없지만 시뮬레이션 결과를 바탕으로 논문 베이스를 쓰고 대략적인 것을 쓰는 도중, 마이크로소프트 캠퍼스 리쿠르팅을 보아 신청하게 되었다.

나의 연구 방향하고 완전 다른 직종이지만 신청할 수 있는 기회가 생겨 신청을 하였는데 몇 칠 후 아래와 같은 Invitation을 받게 되었다.

기억으로는 나에게 3일에 시간이 주어져있었다. 부랴부랴 코딩테스트 준비를하는데 왠걸…. 인터넷에 널려 있는 문제도 너무 어려웠다. Leetcode사이트에서 문제를 푸는데 Easy로 분류되어있는 문제도 제대로 못풀고 답안지 없이는 잘못풀었다. 알고리즘 문제를 푸는 것은, 옛날 대학시절 인적성 문제를 푸는 듯한 많은 노력이 필요하다는 것을 깨닫게 되었다. 하지만 어쩌겠는가 나에게 주어진 시간은 얼마 없으니, 우선 Microsoft Internship Coding Test 기출 되었던 문제들을 인터넷에 검색하여 차근차근 하나씩 풀어보았다.

가장 많이 출제된 15문제를 뽑아서, 문제 이해 및 해답 없이 풀이까지 반복적으로 풀어서 준비를 했다. 주로 기출문제는 Listed 데이터 구조로 Binary Search와 Loop Detection 이 주였던거 같다. 열심히 풀고 이제 자신감이 업 되었다.

드디어 시험의 시간이 도달하였다. 시험은 총 2시간에 3문제였다. 그래 이태까지 연습했던 대로 하면 되겠지라는 자신감으로 시험에 임하였는데.. 내가 생각했던 문제들하고 달랐다. 긴 Story를 주고 스토리 안에 문제를 푸는 방식이였던 것이다.(연습했을때는 그냥 알고리즘만 구현해봤는데) 문제도 제대로 이해 안되었지만 예를 들어 맥주병이 3개가 있는데, 어떻게 어떻게 해서 총을 가지고 맥주병을 맞추는 문제였다. 당황은 하였지만 침착하게 문장을 읽어 내려갔다. 그리고 문제를 풀어보는데, 문제가 제대로 풀리지 않았다. 그래서 문제 1번을 먼저 보고 풀다가, 2번으로 넘어가서 2번문제로 풀고, 막히면 3번 문제를 넘어가서 풀고를 반복을 하였다. C++로 문제를 풀었는데 잘 풀리지 않으면 python으로도 도전을 해보았다. 그렇게 1시간을 해매고, 한문제도 제대로 푼 문제가 없어, 한문제라도 제대로 풀자는 결심을 하여 문제를 풀었다. 그렇게 2시간을 보내고 한문제를 풀긴 하였지만 debug중에 점수를 못 맞은것도 있었다. 그런데 어쩌겠는가. 그냥 내야지.

긴 시간을 보내고 정말 코딩 테스트 합격하는 사람은 대단하다고 느꼈다. 그러면서 내 자신에 대해 자신감이 낮아지면서 컴퓨터 사이언스 지식과 알고리즘 문제를 다시 공부시작하였다.

하지만 나는 비전공자이기에 코딩 공부가 꼭 필요한 것인지 무엇부터 공부해야될지 몰라 유투브의 코드없는 프로그래밍님의 유투브를 보다 뜬금없이 메일을 보내어 고민을 풀었는데, 바로 답장이 왔다.

노코프님의 조언을 받아 바로 Udemy에 Fundamental of Computer science 코스와 Modern C++, 그리고 Data structure & algorithm의 강의를 바로 구매하였고, 추가적으로 심심할때 공부하려고 Cuda 강좌도 샀다.

기초를 튼튼히 쌓아서 코딩 시험에 합격할 것이다.

Comment  Read more