본문 바로가기

컴퓨터 공부/잡다한거

TCP/IP stack

데이터 전송과정

 


1. Write 시스템 콜을 호출해서 데이터를 보낸다. 시스템콜을 했으니 커널 영역으로 전환
2.유저가 입력한 데이터가 커널 메모리에 복사가되고 send socket buffer의 뒷부분에 추가된다
이유는 순서대로 전송하기 위해서다.
3.TCP를 호출한다... TCB에는 TCP연결 처리에 필요한 정보가 있다 (connection state,receive window,congestionwindow sequence번호, 재전송 타이머등)
현재 TCP 상태가 데이터전송을 허용하면 새로운 TCP segment, 즉 패킷을 생성한다.만약 데이터 전송이 불가능하면 시스템 콜은 여기서 끝나고 유저모드로 돌아감

4.TCP checksum을 계산함 이 checksum계산에는 pseudo헤더정보(IP주소,segment길이,프로토콜 번호)를 포함함 TCP상태에 따라 패킷을 한개 이상전송가능
(요즘은 커널이 checksum을 계산하지않고 checksum offloadNIC이 함)

5. 생성된 TCP segment는 IP레이어로 내려가 TCP segment에 IP헤더를 추가하고 IP routing을함(IProuting이란 목적지 IP주소로 가기위한 다음장비의 IP주소를 찾는과정)
그리고 checksum을 계산하여 덧붙인 후 eternet 레이어로 데이터를 보냄


6. Ethernet 레이어는 ARP를 사용해서 next hop IP의 MAC주소를 찾은 후 Ethernet 헤더까지 붙이면 호스트 패킷이 완성됨

7.위 과정(5번)에서 ip routing의 결과물로  next hop IP와 해당 IP로 패킷 전송시 사용하는 (transmit interface혹은 NIC)인터페이스를 알게됨 따라서 transmitNIC의 드라이버를 호출
transmitNIC의 드라이버를 호출함 
(만약 tcpdump나 wireshark같은 패킷 캡처 프로그램이 작동 중이면 커널이 패킷데이터를 프로그램이 사용하는 메모리버퍼로 복사함 수신도 마찬가지로 바로위에서 패킷을 캡처함 대개 traffic shaper기능도 이레이어에서 동작하도록 설정됨)
드라이버는 NIC제조사가 정의한 드라이버 NIC통신구약에 따라 패킷전송을 요청함

8.NIC는 패킷 전송요청을 받으면 메인 메모리에있는 패킷을 자신(NIC)의 메모리로 복사하고 전송한다 이때 Ethernet표준에 따라 IFG,preamble를 패킷의 시작을 판단하기위해 사용하고 그리고 CRC를 데이터 보호를위해 패킷에 추가한다.(tcp,ip checksum과 같은 용도임)
그리고 패킷전송은 ethernet의 물리적속도와 ethernet flow control에 따라 전송가능상활일 때 시작된다.

9.NIC가 패킷을 전송할 때 NIC가 cpu에 인터럽트를 발생시키고 이 번호를 처리할수있는 적합한 드라이버를 찾는다
드라이버는 인터럽트를처리할수 있는 함수(인터럽트 핸들러)를 드라이버가 가동되었을때 운영체제에 등록해둔 운영체제 핸들러를 운영체제에 등록해둠

10. 운영체제가 핸들러를 호출하고 핸들러는 전송된 패킷을 운영체제에 반환함

애플리케이션에서 쓰기를 하였을 때 데이터가 커널과 디바이스를 거쳐 전송되는과정이다
그런데 커널이 스스로 TCP를 호출해서 패킷을 전송하는 경우가있다 예를 들어 ACK을 받아 receive window가 늘어나면 socket buffer에 남아있는 데이터를 포함한 tcp segment를 생성하여 상대편에 전송하것?

 

 

참고 :  https://d2.naver.com/helloworld/47667